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;
}
}
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 .
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
. = (
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;
}
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;
}
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);
}