2010-06-04 31 views
13

Hey. Tengo el siguiente código que llena mi cuadro de listaListBox y Datasource: evita que se seleccione el primer elemento

UsersListBox.DataSource = GrpList; 

Sin embargo, después de que el cuadro se rellena, el primer elemento de la lista es seleccionada por defecto y el "índice seleccionado cambiado" desencadena el evento. ¿Cómo evito que se seleccione el elemento justo después de que se haya completado el cuadro de lista, o cómo evito que se active el evento?

Gracias

Respuesta

20

Para mantener el evento de disparo, aquí hay dos opciones que he utilizado en el pasado:

  1. Eliminar el registro del controlador de eventos al configurar el origen de datos.

    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. Crear una bandera booleana ignorar el 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

Tal vez en DataSourceChanged se puede comprobar el estado de SelectedIndex, si tienes suerte, podría forzar a continuación, sólo SelectedIndex = -1.

+0

Say ¿Qué? Si tienes suerte? Y ni siquiera puedo entender lo que tu respuesta dice en realidad. –

-2

Si lo que desea es borrar el valor seleccionado, puede utilizar ClearSelected después de establecer el origen de datos. Pero si no quieres que el evento se dispare, entonces tendrás que usar uno de los métodos de Joseph.

+0

Esta no es una respuesta relevante. –

1

Bueno, parece que el primer elemento se selecciona automáticamente después de establecer ListBox.DataSource. Otras soluciones son buenas, pero no resuelven el problema. Así es como me resolvió el 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

Esta solución funciona bien y es más simple que otras –

1

i usando la siguiente, parece que funciona para mí:

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

conjunto IsSynchronizedWithCurrentItem="False" y también SelectedIndex=-1 y cada cosa debe trabajar para usted

Cuestiones relacionadas