2010-06-04 20 views
13

Hej. Mam następujący kod, który zapełnia moje pole listyListBox i Datasource - zapobiega wybraniu pierwszego elementu

UsersListBox.DataSource = GrpList; 

Jednak po skrzynka jest pusta, pierwsza pozycja na liście jest wybrana domyślnie i „wybrany wskaźnik zmienił” pożary zdarzeń. Jak zapobiec wybraniu elementu zaraz po zapełnieniu pola listy lub w jaki sposób zapobiec wystrzeleniu zdarzenia?

Dzięki

Odpowiedz

20

Aby utrzymać imprezę z odpaleniem, tu są dwie opcje mam stosowanych w przeszłości:

  1. wyrejestrować obsługi zdarzeń podczas ustawiania 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. Utwórz flagę boolowską, aby zignorować zdarzenie.

    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

Być może w DataSourceChanged można sprawdzić stan SelectedIndex, jeśli masz szczęście można to po prostu zmusić SelectedIndex = -1.

+0

Say co? Jeśli masz szczęście? I nie mogę nawet zrozumieć, co właściwie twoja odpowiedź mówi. –

-2

Jeśli chcesz tylko usunąć wybraną wartość, można użyć ClearSelected po ustawieniu DataSource. Ale jeśli nie chcesz, aby wydarzenie się rozpaliło, musisz użyć jednej z metod Josepha.

+0

To nie jest odpowiednia odpowiedź. –

1

Wygląda na to, że pierwszy element jest automatycznie wybierany po ustawieniu ListBox.DataSource. Inne rozwiązania są dobre, ale nie rozwiązują problemu. To jak ja nie rozwiąże problemu:

// 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

To rozwiązanie działa dobrze i jest prostsze niż inne –

1

i przy użyciu następujących, wydaje się działać dla mnie:

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

ustawić IsSynchronizedWithCurrentItem="False" a także SelectedIndex=-1 i każda rzecz powinna pracować dla Ciebie

Powiązane problemy