使用Dictionary作为数据源绑定组合框

时间:2011-06-20 14:25:11

标签: c# .net winforms combobox datasource

我正在使用.NET 2.0,我正在尝试将组合框的数据源绑定到排序字典。

所以我得到的错误是“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";

9 个答案:

答案 0 :(得分:117)

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到“值”?)

答案 1 :(得分:19)

我使用了Sorin Comanescu的解决方案,但在尝试获取所选值时遇到了问题。我的组合框是一个工具条组合框。我使用了“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

希望它可以帮助别人!

答案 2 :(得分:6)

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

绑定到Combobox

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

完整来源...... Dictionary as a Combobox Datasource

Jeryy

答案 3 :(得分:4)

userListComboBox.DataSource = userCache.ToList();
userListComboBox.DisplayMember = "Key";

答案 4 :(得分:2)

字典不能直接用作数据源,您应该做更多。

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

答案 5 :(得分:0)

如果这不起作用,为什么不简单地在字典上做一个foreach循环,将所有项目添加到组合框中?

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

答案 6 :(得分:0)

使用 - &gt;

comboBox1.DataSource = colors.ToList();

除非字典转换为列表,否则组合框无法识别其成员。

答案 7 :(得分:0)

试着这样做....

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

答案 8 :(得分:0)

我知道这是一个很老的话题,但是我也遇到了同样的问题。

我的解决方案:

我们如何填充组合框:

foreach (KeyValuePair<int, string> item in listRegion)
{
    combo.Items.Add(item.Value);
    combo.ValueMember = item.Value.ToString();
    combo.DisplayMember = item.Key.ToString();
    combo.SelectedIndex = 0;
}

这就是我们进入内部的方式:

 MessageBox.Show(combo_region.DisplayMember.ToString());

我希望它可以帮助某人