Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Problema con Listbox

  1. #1

    Problema con Listbox

    Vorrei realizzare una classica applicazione con 2 listbox e 4 pulsanti (>,>>,<,<<)
    Nella prima listbox carico i dati da un dataset.
    Cliccando > copio solo gli items selezionati nella seconda listbox
    Cliccando >> copio tutti gli items nella seconda testbox
    Cliccando << pulisco la seconda listbox

    Il problema sorge con il pulsante < che dovrebbe togliere dalla seconda listbox
    solo gli elementi selezionati. Ma non capisco come mai me ne toglie sempre qualcuno in meno.


    Questo è il codice:

    private void Page_Load(object sender, System.EventArgs e)
    {
    if (!IsPostBack)
    {
    Carica();
    }

    if (IsPostBack)
    {
    for (int i = 0; i < ListBox1.Items.Count; i++)
    {
    if (ListBox1.Items[i].Selected)
    ListBox2.Items.Add(ListBox1.Items[i].Text);
    }
    }

    bindData();
    }


    void Carica()
    {
    oleDbDataAdapter1.Fill(dataSet11);
    Cache["AppData"] = dataSet11;
    }


    public void bindData()
    {
    oleDbDataAdapter1.Fill(dataSet11);
    ListBox1.DataBind();
    }



    //Questo è il pulsante <

    private void Button4_Click(object sender, System.EventArgs e)
    {

    for (int i = 0; i < ListBox2.Items.Count; i++)
    {
    if (ListBox2.Items[i].Selected)
    ListBox2.Items.Remove(ListBox2.Items[i].Text);
    }
    }




    Sicuramente esistono modi migliori di gestire il tutto,per cui se qualcuno
    ha dei suggerimenti sono ben accetti.

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Secondo me, questo è un giochetto che dovrebbe essere fatto nel client con javascript, dato che è molto imbarazzante rinviare la pagina al server per fare queste cose.
    Ma se proprio vuoi farlo nel server, ci provo e ti faccio sapere
    Pietro

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    codice:
    private void Page_Load(object sender, System.EventArgs e)
    {
    	// Inserire qui il codice utente necessario per inizializzare la pagina.
    
    	if(!this.IsPostBack) carica();
    
    
    }
    
    
    void carica()
    {
    	this.ListBox1.Items.Add(new ListItem("rosso","rosso"));
    	this.ListBox1.Items.Add(new ListItem("verde","verde"));
    	this.ListBox1.Items.Add(new ListItem("blu","blu"));
    	this.ListBox1.Items.Add(new ListItem("giallo","giallo"));
    
    }
    
    private void LinkButton1_Click(object sender, System.EventArgs e)
    {/* > */
    	if(this.ListBox1.SelectedIndex > -1)
    	{
    		System.Web.UI.WebControls.ListItem item = this.ListBox1.SelectedItem;
    		item.Selected = false;
    		this.ListBox2.Items.Add(item);
    		this.ListBox1.Items.Remove(item);				
    	}
    
    }
    
    private void LinkButton2_Click(object sender, System.EventArgs e)
    {/* >> */
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox1.Items)
    		this.ListBox2.Items.Add(item);
    	this.ListBox1.Items.Clear();
    }
    
    private void LinkButton3_Click(object sender, System.EventArgs e)
    {/* < */
    	if(this.ListBox2.SelectedIndex > -1)
    	{
    		System.Web.UI.WebControls.ListItem item = this.ListBox2.SelectedItem;
    		item.Selected = false;
    		this.ListBox1.Items.Add(item);
    		this.ListBox2.Items.Remove(item);				
    	}
    
    }
    
    private void LinkButton4_Click(object sender, System.EventArgs e)
    {/* << */
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox2.Items)
    		this.ListBox1.Items.Add(item);
    	this.ListBox2.Items.Clear();
    
    }

    mi vergogno, ma è il primo scritto che faccio in c#. Se non funziona come ti aspetti, sii comprensivo
    Pietro

  4. #4
    Funziona come la mia tranne che nella mia non elimino mai nessun items
    dalla listbox1 (di sinistra)
    Il problema però anche nella tua versione rimane: quando seleziono ad esempio 4 items dalla listbox di destra (listbox2) e clicco il pulsante < ne toglie solamente alcuni e non tutti i selezionati (sembra che perda qualche selected per strada)

    La stessa cosa avviene se non metto la funzione > (dalla listbox1 copio gli items selezionati nella listbox2) con la differenza che qui perde tutti gli item selected come conseguenza del postback.

    if (!IsPostBack)
    {
    Carica();
    }

    if (IsPostBack)
    {
    dataSet11 = (DataSet1)Cache["AppData"];
    dataSet21 = (DataSet2)Cache["AppData1"];
    }

    bindData();
    }

    void Carica()
    {
    oleDbDataAdapter2.Fill(dataSet21);
    oleDbDataAdapter1.Fill(dataSet11);

    }

    public void bindData()
    {

    ListBox1.DataBind();
    DropDownList1.DataBind();

    }


    Il problema è qui (bottone >) che sul post back perde il selected degli item.
    E

    private void Button1_Click(object sender, System.EventArgs e)
    {

    for (int i = 0; i < ListBox1.Items.Count; i++)
    {
    if (ListBox1.Items[i].Selected)
    //Response.Write(ListBox1.Items[i].Text);
    ListBox2.Items.Add(ListBox1.Items[i].Text);
    }

    }


    In questo punto invece (bottone <) perde alcuni selected.

    private void Button4_Click(object sender, System.EventArgs e)
    {

    if(this.ListBox2.SelectedIndex > -1)
    {
    System.Web.UI.WebControls.ListItem item = this.ListBox2.SelectedItem;
    item.Selected = false;
    //this.ListBox1.Items.Add(item);
    this.ListBox2.Items.Remove(item);
    }

    }

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    non sapevo che i lisbox fossero a selezione multipla

    puoi provare se così funziona?
    codice:
    private void Page_Load(object sender, System.EventArgs e)
    {
    	// Inserire qui il codice utente necessario per inizializzare la pagina.
    	if(!this.IsPostBack) carica();
    }
    
    
    
    void carica()
    {
    	this.ListBox1.Items.Add(new ListItem("rosso","rosso"));
    	this.ListBox1.Items.Add(new ListItem("verde","verde"));
    	this.ListBox1.Items.Add(new ListItem("blu","blu"));
    	this.ListBox1.Items.Add(new ListItem("giallo","giallo"));
    
    }
    
    private void LinkButton1_Click(object sender, System.EventArgs e)
    {/* > */
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox1.Items)
    		if(item.Selected) this.ListBox2.Items.Add(item);
    
    	for (int i = this.ListBox1.Items.Count - 1; i >= 0 ; i--)
    	{
    		System.Web.UI.WebControls.ListItem item = this.ListBox1.Items[i];
    		if (item.Selected)
    		{
    			item.Selected = false;
    			this.ListBox1.Items.Remove(item);
    		}
    	}
    }
    
    private void LinkButton2_Click(object sender, System.EventArgs e)
    {/* >> */
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox1.Items)
    		this.ListBox2.Items.Add(item);
    	this.ListBox1.Items.Clear();
    }
    
    private void LinkButton3_Click(object sender, System.EventArgs e)
    {/* << */
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox2.Items)
    		this.ListBox1.Items.Add(item);
    	this.ListBox2.Items.Clear();
    
    }
    
    private void LinkButton4_Click(object sender, System.EventArgs e)
    {/* < */
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox2.Items)
    		if(item.Selected) this.ListBox1.Items.Add(item);
    
    	for (int i = this.ListBox2.Items.Count - 1; i >= 0 ; i--)
    	{
    		System.Web.UI.WebControls.ListItem item = this.ListBox2.Items[i];
    		if (item.Selected)
    		{
    			item.Selected = false;
    			this.ListBox2.Items.Remove(item);
    		}
    	}
    }
    Pietro

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ho provato pure in questo modo e mi sembra che funzioni. vuoi provare?
    codice:
    private void Page_Load(object sender, System.EventArgs e)
    {
    	// Inserire qui il codice utente necessario per inizializzare la pagina.
    
    	if(!this.IsPostBack) carica();
    
    
    }
    
    
    void carica()
    {
    	this.ListBox1.Items.Add(new ListItem("rosso","rosso"));
    	this.ListBox1.Items.Add(new ListItem("verde","verde"));
    	this.ListBox1.Items.Add(new ListItem("blu","blu"));
    	this.ListBox1.Items.Add(new ListItem("giallo","giallo"));
    
    }
    
    private void LinkButton1_Click(object sender, System.EventArgs e)
    {	// >
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox1.Items)
    	{
    		if(item.Selected)
    		{
    			item.Selected = false;
    			this.ListBox1.Items.Remove(item);
    			this.ListBox2.Items.Add(item);
    			LinkButton1_Click(null, null);
    			break;
    		}
    	}
    }
    
    private void LinkButton2_Click(object sender, System.EventArgs e)
    { // >>
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox1.Items)
    		this.ListBox2.Items.Add(item);
    	this.ListBox1.Items.Clear();
    }
    
    private void LinkButton3_Click(object sender, System.EventArgs e)
    { // <
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox2.Items)
    	{
    		if(item.Selected)
    		{
    			item.Selected = false;
    			this.ListBox2.Items.Remove(item);
    			this.ListBox1.Items.Add(item);
    			LinkButton3_Click(null, null);
    			break;
    		}
    	}
    }
    
    private void LinkButton4_Click(object sender, System.EventArgs e)
    {	// <<
    	foreach(System.Web.UI.WebControls.ListItem item in this.ListBox2.Items)
    		this.ListBox1.Items.Add(item);
    	this.ListBox2.Items.Clear();
    
    }
    Pietro

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    scusami se rompo, ma lo sto vedendo adesso.
    Credo che il modo migliore per togliere gli elementi selezionati da una lista sia fare un ciclo inverso, partendo dall'indice maggiore all'indice 0, qualcosa del genere:
    codice:
    for (int i = this.ListBox2.Items.Count - 1; i >= 0 ; i--)
    {
    	System.Web.UI.WebControls.ListItem item = this.ListBox2.Items[i];
    	if (item.Selected) this.ListBox2.Items.Remove(item);
    }
    Pietro

  8. #8
    Così funziona alla perfezione.
    Per caso hai un idea del perchè si debba ciclare partendo dall'indice maggiore al minore?

    Un ultima cosa:

    Quando clicco un pulsante eseguo un postback della pagina, esatto?
    Come mai perdo lo stato dei controlli anche se ho il viewstate abilitato?
    Sono costretto ad aggiungere la funzione del pulsante >
    if (IsPostBack)
    {
    for (int i = 0; i < ListBox1.Items.Count; i++)
    {
    if (ListBox1.Items[i].Selected)
    ListBox2.Items.Add(ListBox1.Items[i].Text);
    }
    }

    Non esiste un modo per mantenere lo stato dei controlli anche dopo aver effettuato il binding dei dati?

    Comunque grazie mille, sei stato veramente utile e disponibile.

  9. #9
    Ho risolto il problema del postback...
    piano piano inizio a capire come funziona asp.net

  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    supponi di avere 3 item:
    A indice 0
    B indice 1
    C indice 2

    sono tutti selezionati e voglio eliminare tutti i selezionati (tutti)
    1) elimino indice 0: A indice 0
    rimane:
    B indice 0
    C indice 1

    2) elimino indice 1. B indice 0 viene saltato

    rimane:
    C indice 0

    3) cerco di eliminare indice 2. Dà errore perchè non esiste

    Prova a farlo al contrario e vedi che tutto fila liscio :gren:
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.