Binding Combobox с использованием словаря в качестве источника данных - PullRequest
58 голосов
/ 20 июня 2011

Я использую .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";

Ответы [ 8 ]

118 голосов
/ 20 июня 2011
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 также с «Значение»)?

19 голосов
/ 08 апреля 2013

Я использовал решение Сорина Команеску, но столкнулся с проблемой при попытке получить выбранное значение. Мой комбинированный список был списком инструментов. Я использовал свойство 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

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

6 голосов
/ 08 октября 2014
        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 голосов
/ 20 марта 2014
userListComboBox.DataSource = userCache.ToList();
userListComboBox.DisplayMember = "Key";
2 голосов
/ 22 июня 2011

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

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";
0 голосов
/ 25 февраля 2016

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

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 голосов
/ 07 января 2015

Использование ->

comboBox1.DataSource = colors.ToList();

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

0 голосов
/ 20 июня 2011

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

foreach(var item in userCache)
{
    userListComboBox.Items.Add(new ListItem(item.Key, item.Value));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...