web-dev-qa-db-fra.com

Événement ComboBox SelectedIndexChanged: comment obtenir l'index précédemment sélectionné?

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 capable de dire quel était l'indice précédemment sélectionné ... quelqu'un peut-il m'indiquer dans la bonne direction?

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

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

Utilisez -1 comme "dernier index" non initialisé, vous devez donc le définir en premier, mais ne l'utilisez pas. Les passages suivants vous l'utilisez et le définissez.

Vous pouvez toujours le faire en utilisant votre propre classe ComboBox dérivée, en remplaçant OnSelectedIndexChanged et en exposant une propriété PreviousSelectedIndex. De cette façon, il ne serait pas étroitement associé à la forme. Sinon, comme vous pouvez le faire en utilisant des événements, il est également éligible pour une implémentation en tant que fournisseur d'extendeur .

23
Adam Houldsworth

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, vous pouvez peut-être utiliser l'événement Control.Validating ? Je ne peux tout simplement pas dire si cet événement se produit avant ou après l'événement SelectedIndexChanged. = (

3
Will Marcouiller

J’ai eu un problème similaire à celui-ci dans lequel j’ai réglé toutes mes boîtes à choix sur "autocomplete" en utilisant 

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

J'ai parcouru et défini tous leurs événements lostFocus:

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

et avait un objet de dictionnaire pour contenir les anciennes valeurs

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

puis enfin, assurez-vous que la valeur existe ou soit définie sur l'ancien index, puis enregistrez-la 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;
}
0
Jessie Lulham

que diriez-vous de l'événement comboBox_SelectionChangeCommitted? Ceci est appelé après la sélection, le menu est réduit mais l'élément n'est pas complètement modifié. 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

Celui-ci pour obtenir l'index sélectionné en cours, j'en ai juste besoin et je ne pouvais trouver nulle part, alors 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
Yusufm.Salh