web-dev-qa-db-ja.com

辞書をデータソースとして使用したコンボボックスのバインド

.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";
58
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"に)?

119
Sorin Comanescu

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

それが他の誰かに役立つことを願っています!

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

コンボボックスへのバインド

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

完全なソース... コンボボックスデータソースとしての辞書

ジェリー

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();

辞書がリストに変換されない限り、combo-boxはそのメンバーを認識できません。

0
Swaraj

これがうまくいかない場合、コンボボックスにすべてのアイテムを追加する辞書で単にforeachループを実行しないのはなぜですか?

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