web-dev-qa-db-fra.com

Combobox de liaison utilisant un dictionnaire comme source de données

J'utilise .NET 2.0 et j'essaie de lier la source de données d'une liste déroulante à un dictionnaire trié.

Donc, l'erreur que je reçois est "La propriété DataMember 'Key' est introuvable sur la source de données".

        SortedDictionary<string, int> userCache = UserCache.getSortedUserValueCache();
        userListComboBox.DataSource = new BindingSource(userCache, "Key"); //This line is causing the error
        userListComboBox.DisplayMember = "Key";
        userListComboBox.ValueMember = "Value";
57
user803952
SortedDictionary<string, int> userCache = new SortedDictionary<string, int>
{
  {"a", 1},
  {"b", 2},
  {"c", 3}
};
comboBox1.DataSource = new BindingSource(userCache, null);
comboBox1.DisplayMember = "Key";
comboBox1.ValueMember = "Value";

Mais pourquoi définissez-vous ValueMember sur "Valeur", ne devrait-il pas être lié à "Key" (et DisplayMember à "Valeur" également)?

115
Sorin Comanescu

J'ai utilisé la solution de Sorin Comanescu, mais j'ai rencontré un problème en essayant d'obtenir la valeur sélectionnée. Ma combobox était une combobox à barres d'outils. J'ai utilisé la propriété "combobox", qui expose une combobox normale.

J'ai eu un 

 Dictionary<Control, string> controls = new Dictionary<Control, string>();

Code contraignant (la solution de Sorin Comanescu - a fonctionné comme un charme):

 controls.Add(pictureBox1, "Image");
 controls.Add(dgvText, "Text");
 cbFocusedControl.ComboBox.DataSource = new BindingSource(controls, null);
 cbFocusedControl.ComboBox.ValueMember = "Key";
 cbFocusedControl.ComboBox.DisplayMember = "Value";

Le problème était que lorsque j'ai essayé d'obtenir la valeur sélectionnée, je ne savais pas comment la récupérer. Après plusieurs tentatives, j'ai eu ceci:

 var control = ((KeyValuePair<Control, string>) cbFocusedControl.ComboBox.SelectedItem).Key

J'espère que ça aide quelqu'un d'autre!

19
CristisS
        var colors = new Dictionary < string, string > ();
        colors["10"] = "Red";

Liaison à la Combobox

        comboBox1.DataSource = new BindingSource(colors, null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key"; 

Full Source ... Dictionnaire en tant que source de données Combobox

Jeryy

6
jeryymanly
userListComboBox.DataSource = userCache.ToList();
userListComboBox.DisplayMember = "Key";
4
smashrain

Un dictionnaire ne peut pas être utilisé directement comme source de données, vous devriez en faire plus.

SortedDictionary<string, int> userCache =  UserCache.getSortedUserValueCache();
KeyValuePair<string, int> [] ar= new KeyValuePair<string,int>[userCache.Count];
userCache.CopyTo(ar, 0);
comboBox1.DataSource = ar; new BindingSource(ar, "Key"); //This line is causing the error
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
2
DeveloperX

Essayez juste de faire comme ça ....

SortedDictionary<string, int> userCache = UserCache.getSortedUserValueCache();

    // Add this code
    if(userCache != null)
    {
        userListComboBox.DataSource = new BindingSource(userCache, null); // Key => null
        userListComboBox.DisplayMember = "Key";
        userListComboBox.ValueMember = "Value";
    }
0
i486you

Utiliser -> 

comboBox1.DataSource = colors.ToList();

Sauf si le dictionnaire est converti en liste, la liste déroulante ne peut pas reconnaître ses membres.

0
Swaraj

Si cela ne fonctionne pas, pourquoi ne pas simplement faire une boucle foreach sur le dictionnaire en ajoutant tous les éléments à la liste déroulante?

foreach(var item in userCache)
{
    userListComboBox.Items.Add(new ListItem(item.Key, item.Value));
}
0
thekip