Liaison d'un ComboBox à un IList et utilisation de SelectedValue
-
05-07-2019 - |
Question
J'ai une ComboBox
configurée comme suit, où KVPList
est un IList
(of KeyValuePair
s'il questions):
comboBox.DisplayMember = "Value";
comboBox.ValueMember = "Key";
comboBox.DataSource = KVPList;
J'ai ensuite établi une liaison avec SelectedValue
, liant un BindingSource
(à un DataSet
). Pour une raison quelconque, la liste déroulante est toujours vide lorsque le formulaire est affiché. Cependant, il est correctement rempli (les valeurs de IList
s’affichent bien et peuvent être sélectionnées).
Maintenant, j'ai fait de mon mieux pour effectuer le suivi, et il semble que, initialement, la SelectedValue soit correctement définie correctement, mais qu'elle soit réinitialisée quelque part en cours sur null
. J'ai joué avec l'ordre, les choses sont également appelées, mais en vain.
Quelqu'un peut-il nous éclairer ou suggérer une solution de contournement?
Pour mémoire, sur le même formulaire, j'ai un autre ComboBox
sur le même formulaire, avec son SelectedValue
lié ??au même BindingSource
. Le DataSource
est un DataSet
, et non un IList
et fonctionne comme un charme. Ce pourrait être une option pour créer un DataTable
à partir de IList
, mais cela semble être une charge supplémentaire considérable; Je génère le IList
à partir d'une énumération.
La solution
Aïe. Après avoir pratiquement perdu une demi-journée avec celui-ci, je l'ai compris. C'était complètement une erreur de ma part.
La KVPList
a été définie sur une IList
de KeyValuePair <
abrégé
< code>, chaîne > , mais le champ de données est de type int
. Pour l’essentiel, la liaison de données se déclenche et définit la propriété SelectedValue
. Ensuite, les liaisons DisplayMember
et ValueMember
se déclenchent, en vérifiant à nouveau le SelectedValue
. Étant donné que ValueMember
est de type short
et non pas int
, il ne trouve pas de correspondance et le définit donc sur null.
Quelque chose de drôle doit se passer avec la boxe et le déballage, mais je suis trop fatigué pour comprendre pourquoi maintenant.
Je laisserai cette question de côté si quelqu'un d'autre se heurte au même problème. Il est difficile à repérer, car je pense que le système essaiera de lancer une exception ou de lancer une exception, mais pas automatiquement. Après tout, short
et int
sont tous les deux des types valeur et la dernière fois que j'ai vérifié (int) 10 == (bref) 10
est vrai.