如何通过数据源的键或值更改当前选定的项目?

时间:2015-02-27 17:46:44

标签: c# winforms .net-4.5

我有一个Dictionary<uint, string>和一个ComboBox使用样式DropDownList,我绑定了这个字典,如:

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

现在我希望能够通过单击按钮选择我的字典中的任意项目,因此给定绑定的字典项目:

Dictionary<uint, string> myDic = new Dictionary<uint, string>()
{
    { 270, "Name1" },
    { 1037, "Name2" },
    { 1515, "Name3" },
};

我试过了:

comboBox1.SelectedItem = myDic[270];
comboBox1.SelectedText = myDic[270];
comboBox1.SelectedValue = myDic[270];
comboBox1.SelectedItem = 270;
comboBox1.SelectedValue = 270;

但以上都没有改变所选项目。

如何通过数据源的键或值更改当前所选项目?

3 个答案:

答案 0 :(得分:1)

您可以使用我找到here

的小扩展方法来完成此操作

把它放到扩展类中。

public static KeyValuePair<TKey, TValue> GetEntry<TKey, TValue>
        (this IDictionary<TKey, TValue> dictionary,
            TKey key)
{
    return new KeyValuePair<TKey, TValue>(key, dictionary[key]);
}

然后你可以像这样设置你的项目

comboBox1.SelectedItem = myDic.GetEntry<uint,string>(1515);

这个问题的关键是你必须设置KeyValuePair(而不仅仅是uint或字符串值/键)。

希望这有帮助!

答案 1 :(得分:0)

这很有效。不确定非常大的列表上的性能,但你可能不想要一个巨大的ComboBox列表。

foreach (var item in myDic)
    comboBox1.Items.Add(item.Value); // Populate the ComboBox by manually adding instead of binding

comboBox1.SelectedIndex = comboBox1.Items.IndexOf(myDic[1037]);

此代码的明显问题是解雇DataSource绑定,这可能与您有关,也可能不适用。也许其他人会提供更好的答案。

答案 2 :(得分:0)

昨天正在寻找,我碰巧在查询驱动DataSource,它把它投向BindingSource并发现了一个属性&#34; Current&#34;它确定从链接内部选择KeyPar。因此,将值更改为test和Bingo!

Dictionary<int,string> diccionario=new Dictionary<int,string>();
diccionario.Add(1,"Bella");
diccionario.Add(2,"Bestia");
this.comboList.DisplayMember = "Value";
this.comboList.ValueMember = "Key";    
this.comboList.DataSource = new BindingSource(diccionario, null);
((BindingSource)this.comboList.DataSource).Position=0; // select init

///////Method's change ///////

((BindingSource)this.comboList.DataSource).Position =Convert.ToInt32(value);