it-roy-ru.com

Связывание Combobox с использованием словаря в качестве источника данных

Я использую .NET 2.0 и пытаюсь связать источник данных в выпадающем списке со отсортированным словарем.

Поэтому я получаю сообщение об ошибке: «Свойство DataMember« Ключ »не может быть найдено в источнике данных».

        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";

Но почему вы устанавливаете ValueMember в значение «Value», не должно ли оно быть привязано к «Key» (и DisplayMember также к «Value»)?

115
Sorin Comanescu

Я использовал решение Сорина Команеску, но столкнулся с проблемой при попытке получить выбранное значение. Мой комбинированный список был списком инструментов. Я использовал свойство «combobox», которое предоставляет обычный combobox.

У меня есть 

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

Связующий код (решение Сорина Команеску - работает как шарм):

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

Проблема заключалась в том, что когда я пытался получить выбранное значение, я не понимал, как его получить. После нескольких попыток я получил это:

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

Надеюсь, это поможет кому-то еще!

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

Связывание с Combobox

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

Полный источник ... Словарь как источник данных Combobox

Jeryy

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

Словарь не может быть непосредственно использован в качестве источника данных, вы должны сделать больше.

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

Просто попробуйте сделать так ....

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

Используйте -> 

comboBox1.DataSource = colors.ToList();

Если словарь не преобразован в список, комбинированный список не может распознать его членов.

0
Swaraj

Если это не работает, почему бы просто не выполнить цикл foreach над словарем, добавляя все элементы в комбинированный список?

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