2010-06-04 8 views
13

Ehi. Ho il seguente codice che popola la mia casella di riepilogoListBox e origine dati - impedisce di selezionare il primo elemento

UsersListBox.DataSource = GrpList; 

Tuttavia, dopo che la scatola è popolata, la prima voce dell'elenco è selezionata per impostazione predefinita e la "indice selezionato cambiato" generato l'evento. Come posso evitare che l'elemento venga selezionato subito dopo aver compilato la casella di riepilogo o come si impedisce l'attivazione dell'evento?

Grazie

risposta

20

Per mantenere l'evento da sparo, qui ci sono due opzioni che ho usato in passato:

  1. Annullare la registrazione del gestore di eventi durante l'impostazione del DataSource.

    UsersListBox.SelectedIndexChanged -= UsersListBox_SelectedIndexChanged; 
    UsersListBox.DataSource = GrpList; 
    UsersListBox.SelectedIndex = -1; // This optional line keeps the first item from being selected. 
    UsersListBox.SelectedIndexChanged += UsersListBox_SelectedIndexChanged; 
    
  2. Creare un flag booleano per ignorare l'evento.

    private bool ignoreSelectedIndexChanged; 
    private void UsersListBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
        if (ignoreSelectedIndexChanged) return; 
        ... 
    } 
    ... 
    ignoreSelectedIndexChanged = true; 
    UsersListBox.DataSource = GrpList; 
    UsersListBox.SelectedIndex = -1; // This optional line keeps the first item from being selected. 
    ignoreSelectedIndexChanged = false; 
    
-4

Forse in DataSourceChanged si potrebbe verificare lo stato di SelectedIndex, se siete fortunati potreste allora basta forzare SelectedIndex = -1.

+0

Say che cosa? Se sei fortunato? E non riesco nemmeno a capire cosa stia effettivamente dicendo la tua risposta. –

-2

Se si desidera solo per cancellare il valore selezionato, è possibile utilizzare ClearSelected dopo aver impostato il DataSource. Ma se non vuoi che l'evento esploda, allora dovrai usare uno dei metodi di Joseph.

+0

Questa non è una risposta pertinente. –

1

Bene, sembra che il primo elemento sia selezionato automaticamente dopo l'impostazione di ListBox.DataSource. Altre soluzioni sono buone, ma non risolvono il problema. Questo è come mi ha risolto il problema:

// Get the current selection mode 
SelectionMode selectionMode = yourListBox.SelectionMode; 

// Set the selection mode to none 
yourListBox.SelectionMode = SelectionMode.None; 

// Set a new DataSource 
yourListBox.DataSource = yourList; 

// Set back the original selection mode 
yourListBox.SelectionMode = selectionMode; 
+0

Questa soluzione funziona bene ed è più semplice di altre –

1

i utilizzando il seguente, sembra funzionare per me:

List<myClass> selectedItemsList = dataFromSomewhere 

//Check if the selectedItemsList and listBox both contain items 
if ((selectedItemsList.Count > 0) && (listBox.Items.Count > 0)) 
{ 
    //If selectedItemsList does not contain the selected item at 
    //index 0 of the listBox then deselect it 
    if (!selectedItemsList.Contains(listBox.Items[0] as myClass)) 
    { 
     //Detach the event so it is not called again when changing the selection 
     //otherwise you will get a Stack Overflow Exception 
     listBox.SelectedIndexChanged -= listBox_SelectedIndexChanged; 
     listBox.SetSelected(0, false); 
     listBox.SelectedIndexChanged += listBox_SelectedIndexChanged; 
    } 
} 
0

set IsSynchronizedWithCurrentItem="False" e anche SelectedIndex=-1 e ogni cosa dovrebbe funzionare per voi