Связывание Combobox Использование словаря в качестве источника данных
Я использую .NET 2.0, и я пытаюсь связать источник данных combobox с отсортированным словарем.
Итак, ошибка, которую я получаю, заключается в том, что "свойство DataMember" Key "не может быть найдено в источнике данных".
SortedDictionary<string, int> userCache = UserCache.getSortedUserValueCache();
userListComboBox.DataSource = new BindingSource(userCache, "Key"); //This line is causing the error
userListComboBox.DisplayMember = "Key";
userListComboBox.ValueMember = "Value";
Ответы
Ответ 1
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
в "Значение", не следует ли привязывать его к "Ключу" (и DisplayMember
к "Значению" )?
Ответ 2
Я использовал решение Sorin Comanescu, но столкнулся с проблемой при попытке получить выбранное значение. Мой combobox был сборкой инструментальных списков. Я использовал свойство "combobox", которое предоставляет нормальное поле со списком.
У меня был
Dictionary<Control, string> controls = new Dictionary<Control, string>();
Код привязки (решение Sorin Comanescu - работал как шарм):
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
Надеюсь, что это поможет кому-то еще!
Ответ 3
var colors = new Dictionary < string, string > ();
colors["10"] = "Red";
Связывание с Combobox
comboBox1.DataSource = new BindingSource(colors, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
Полный исходный текст... Словарь как источник данных Combobox
Jeryy
Ответ 4
userListComboBox.DataSource = userCache.ToList();
userListComboBox.DisplayMember = "Key";
Ответ 5
Словарь нельзя напрямую использовать в качестве источника данных, вам следует сделать больше.
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";
Ответ 6
Если это не работает, почему бы просто не сделать цикл foreach над словарем, добавляя все элементы в поле со списком?
foreach(var item in userCache)
{
userListComboBox.Items.Add(new ListItem(item.Key, item.Value));
}
Ответ 7
Использовать →
comboBox1.DataSource = colors.ToList();
Если словарь не преобразован в список, combo-box не может распознать его элементы.
Ответ 8
Просто попробуйте сделать это...
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";
}