2010-07-13 26 views
14

Tengo un control de usuario que tiene un controlador de eventos ComboBox y SelectedIndexChanged. En el controlador de eventos, necesito poder decir cuál fue el índice seleccionado previamente ... ¿alguien puede señalarme en la dirección correcta?Evento ComboBox SelectedIndexChanged: cómo obtener el índice previamente seleccionado?

private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // need to get the previously selected index and do some handling here... 
    // ... some handler code here ... 


    switch (cboTargetMode.SelectedIndex) 
    { 
     case 1: // ..... some code here... 
      break; 
     case 2: // ..... some code here... 
      break; 
     case 3: // ..... some code here... 
      break; 
     default: // ..... some code here... 
      break; 
    } 
} 

Respuesta

23

No hay nada integrado, tendrá que escuchar este evento y realizar un seguimiento de una variable de instancia.

Use -1 como un "último índice" sin inicializar, por lo que en la primera pasada lo configura pero no lo usa. Pases posteriores lo usa y lo configura.

Siempre se puede hacer esto utilizando una clase derivada ComboBox propia y anular OnSelectedIndexChanged y exponer una propiedad PreviousSelectedIndex. De esta manera, no estaría estrechamente unido a la forma. Alternativamente, como puede hacerlo utilizando eventos, también es elegible para la implementación como extender provider.

+0

+1 No podría estar más de acuerdo. =) –

+0

¿No debería ser más bien "variable de instancia" en lugar de "variable de clase"? –

+0

@FrankSchmitt ¿Persiguiendo una insignia dragando una publicación de casi 8 años? ;-) Pero sí, estás en lo cierto, he modificado mi respuesta. –

3

Supongo que tendrá que almacenar la corriente (que se convertirá en la anterior más adelante) en una variable para que se utilice como un caché o algo así.

private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e) { 
    // need to get the previously selected index and do some handling here... 
    // ... some handler code here ... 

    // Assuming that the variable PreviousSelectedIndex is declared in the class with value -1. 
    if (PreviousSelectedIndex < 0) 
     PreviousSelectedIndex = cbo.TargetMode.SelectedIndex; 
    else 
     // Do some handling here... 

    switch (cboTargetMode.SelectedIndex) { 
     case 1: // ..... some code here... 
      break; 
     case 2: // ..... some code here... 
      break; 
     case 3: // ..... some code here... 
      break; 
     default: // ..... some code here... 
      break; 
    } 
} 

¿Es esto algo que ya has pensado?

De lo contrario, quizás trabajando con el evento Control.Validating? Simplemente no puedo decir si este evento ocurre antes o después del evento SelectedIndexChanged. = (

0

¿qué tal el caso comboBox_SelectionChangeCommitted? Esto se llama una vez realizada la selección, el menú se derrumbó, pero el artículo no se cambia compleetly. Así que acaba de leer comboBox.SelectedText o comboBox.SelectedValue e incluso ComboBox.selectedIndex

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    int prevIndex = comboBox1.SelectedIndex; 
} 
+0

@Zekeriya, esto fue hace 6 años, pero resolví el problema vinculando bidireccionalmente el 'SelectedItem' y gestionando la selección anterior en' setter' de la propiedad binded en el modelo de vista.Y a decir verdad, esta resultó ser la mejor manera, ya que era más fácil de hacer, y era independiente del control, lo que significaba que no era necesario escribir algún código de controlador para cada control diferente al que enlazaría. lista para. – code4life

+0

Ok, necesitaba una solución para este problema el mes pasado, pero la respuesta aceptada no funcionó para mí. De alguna manera, su respuesta actual tampoco funcionó, pero la revisaré más adelante ... Gracias por la respuesta, de todos modos :) –

+0

La filosofía actual de MVVM que estamos usando en @ mi tienda es evitar convertidores, evitar comportamientos (a menos absolutamente necesario) y tratar de hacer que el modelo de vista haga más trabajo, es decir, hacer * it * proporcionar el SelectedItem, etc. – code4life

0

ésta para obtener el índice seleccionado en ese momento, yo sólo necesito y no pude encontrar en cualquier lugar, por lo que espero que ayude

private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      int i = lsbx_layers.SelectedIndices[0];//selected index 
      MessageBox.Show("Selected item at index : " + i); 
     } 
0

tuve un problema similar a este en la cual di todo mis cuadros combinados para "autocompletar" usando

ComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
ComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; 

I en bucle a través y fijar todos sus LOSTFOCUS Eventos:

foreach(Control control in this.Controls) 
{ 
    if(control is ComboBox) 
    { 
     ((ComboBox)control).LostFocus += ComboBox_LostFocus; 
    } 
} 

y tenía un objeto de diccionario para mantener los viejos valores

public Dictionary<string, int> comboBoxOldValues = new Dictionary<string, int>(); 

, finalmente, asegurar el valor existe o se establece en edad índice, luego guárdelo en el diccionario

private void ComboBox_LostFocus(object sender, EventArgs e) 
{ 
    ComboBox comboBox = (ComboBox)sender; 

    if (comboBox.DataSource is List<YourDataType>) 
    { 
     if (((List<YourDataType>)comboBox.DataSource).Count(x => x.YourValueMember == (YourValueMemberType)comboBox.SelectedValue) == 0) 
     { 
      if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0) 
      { 
       comboBox.SelectedIndex = comboBoxOldValues[comboBox.Name]; 
      } 
      else 
       comboBox.SelectedIndex = -1; 
     } 
    }    

    if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0) 
    { 
     comboBoxOldValues[comboBox.Name] = comboBox.SelectedIndex; 
    } 
    else 
     comboBoxOldValues.Add(comboBox.Name, comboBox.SelectedIndex); 

    if (comboBox.SelectedIndex == -1) 
     comboBox.Text = string.Empty; 
} 
Cuestiones relacionadas