5 votes

Comment actualiser un élément de liste déroulante en place ?

La collection d'éléments ComboBox est une ObjectCollection, donc bien sûr vous pouvez y stocker ce que vous voulez, mais cela signifie que vous n'obtenez pas de propriété Text comme vous le feriez avec, par exemple, un ListViewItem. Le ComboBox affiche les éléments en appelant ToString() sur chaque élément, ou en utilisant la réflexion si la propriété DisplayMember est définie.

Mon ComboBox est en mode DropDownList. J'ai une situation où je veux rafraîchir le texte d'un seul élément de la liste lorsque l'utilisateur le sélectionne. Le problème est que le ComboBox ne demande pas le texte à aucun moment autre que lors du chargement initial, et je ne peux pas trouver comment faire ce que je veux autrement que de supprimer et de réajouter l'élément sélectionné comme ceci :

PlantComboBoxItem selectedItem = cboPlants.SelectedItem as PlantComboBoxItem;

// ...

cboPlants.BeginUpdate();

int selectedIndex = cboPlants.SelectedIndex;
cboPlants.Items.RemoveAt(selectedIndex);
cboPlants.Items.Insert(selectedIndex, selectedItem);
cboPlants.SelectedIndex = selectedIndex;

cboPlants.EndUpdate();

Ce code fonctionne bien, sauf pour le fait que mon événement SelectedIndex est déclenché deux fois (une fois lors de l'événement initial de l'utilisateur, et une autre fois lorsque je réinitialise la propriété dans ce code). Dans ce cas, ce n'est pas grave que l'événement soit déclenché deux fois, mais c'est inefficace, et je déteste ça. Je pourrais ajouter un indicateur pour qu'il quitte l'événement la deuxième fois, mais c'est bidouiller.

Y a-t-il un meilleur moyen pour que cela fonctionne ?

11voto

MrDaniel Points 1262

Un truc sale:

typeof(ComboBox).InvokeMember("Actualiseréléments", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, cboPlants, new object[] { });

4voto

Donut Points 32892

Hmm... pourriez-vous utiliser un BindingList, comme décrit ici? De cette manière, vous pourriez simplement modifier l'élément dans la collection sous-jacente et le voir reflété dans le ComboBox sans avoir à ajouter ou supprimer quoi que ce soit du contrôle.

Il faudrait avoir une collection quelque chose comme cela, contenant tous vos éléments pour le ComboBox:

private BindingList plantComboBoxItems;

Ensuite, à un moment donné (comme lorsque le programme démarre), liez-le au ComboBox:

cboPlants.DataSource = plantComboBoxItems;

Maintenant, vous pouvez simplement modifier la collection directement :

plantComboBoxItems[cboPlants.SelectedIndex].faireCeQueVousVoulez();

Et les changements seront reflétés dans cboPlants. Est-ce ce que vous cherchez?

3voto

Jon Seigel Points 8713

Compris, en utilisant la suggestion de Donut.

Dans la classe du formulaire:

private BindingList _plantList;

Dans la méthode de chargement:

_plantList = new BindingList(plantItems);
cboPlants.DataSource = _plantList;

Dans l'événement SelectedIndexChanged:

int selectedIndex = cboPlants.SelectedIndex;
_plantList.ResetItem(selectedIndex);

Merci!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X