2010-07-13 8 views
14

J'ai un contrôle utilisateur qui a un ComboBox et un gestionnaire d'événements SelectedIndexChanged. Dans le gestionnaire d'événements, je dois être en mesure de dire quel était l'index précédemment sélectionné ... quelqu'un peut-il me pointer dans la bonne direction?Evénement ComboBox SelectedIndexChanged: comment obtenir l'index précédemment sélectionné?

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; 
    } 
} 

Répondre

23

Il n'y a rien de intégré, vous devrez écouter cet événement et garder une trace dans une variable d'instance.

Utilisez -1 comme "dernier index" non initialisé, donc lors du premier passage, vous le définissez mais vous ne l'utilisez pas. Passes subséquentes vous l'utilisez et le définissez.

Vous pouvez toujours le faire en utilisant une classe ComboBox dérivée de votre choix et remplacer OnSelectedIndexChanged et exposer une propriété . De cette façon, il ne serait pas étroitement couplé à la forme. Alternativement, comme vous pouvez le faire en utilisant des événements, il est également admissible à la mise en œuvre en tant que extender provider.

+0

+1 Je ne suis pas d'accord plus. =) –

+0

Ne devrait-il pas plutôt s'agir de "variable d'instance" au lieu de "variable de classe"? –

+0

@FrankSchmitt Chasser un insigne en train de draguer un poste de près de 8 ans? ;-) Mais oui vous avez raison, j'ai modifié ma réponse. –

3

Je suppose que vous devrez stocker le courant (qui deviendra le précédent plus tard) dans une variable afin qu'il soit utilisé comme un cache ou quelque chose comme ça.

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; 
    } 
} 

Est-ce quelque chose que vous avez déjà pensé?

Sinon, peut-être travailler avec l'événement Control.Validating? Je ne peux pas dire si cet événement se produit avant ou après l'événement SelectedIndexChanged. = (

0

comment sur l'événement comboBox_SelectionChangeCommitted? C'est appelé après la sélection effectuée, le menu est effondré, mais l'élément n'a pas compleetly changé. Il suffit donc de lire comboBox.SelectedText ou comboBox.SelectedValue et même comboBox.SelectedIndex

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

@Zekeriya, c'était il y a 6 ans, mais j'ai résolu le problème en reliant deux fois le 'SelectedItem' et en gérant la sélection précédente dans le' setter' de la propriété liée sur le modèle de vue.Et à vrai dire, cela s'est avéré être le meilleur moyen, car il était plus facile à faire, et était agnostique de contrôle - ce qui signifiait que je n'avais pas besoin d'écrire un code de gestionnaire pour chaque contrôle différent que je lierais liste à. – code4life

+0

Ok, j'avais besoin d'une solutiion pour ce problème le mois dernier mais la réponse acceptée n'a pas fonctionné pour moi. D'une manière ou d'une autre, votre réponse actuelle n'a pas fonctionné mais je vais la vérifier plus tard ... Merci pour la réponse de toute façon :) –

+0

La philosophie MVVM actuelle que nous utilisons @ my shop est d'éviter les convertisseurs, d'éviter les comportements (à moins que absolument nécessaire) et essayer d'amener le viewmodel à faire plus de travail - c.-à-d. make * it * fournir le SelectedItem, etc. – code4life

0

celui-ci pour obtenir l'index actuellement sélectionné, j'ai besoin et je ne pouvais pas trouver nulle part, donc j'espère que cela aide

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

J'ai eu un problème semblable à celui dans lequel je mets tous mes zones de liste déroulante à "autocomplete" en utilisant

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

I bouclées et mettre tous leurs LOSTFOCUS Événements:

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

et avait un objet dictionnaire pour maintenir les anciennes valeurs

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

puis enfin assurer la valeur existe ou définie dans l'ancien index, puis enregistrer dans le dictionnaire

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; 
} 
Questions connexes