11

WinFormsアプリケーションがあります。ComboBoxに次のコードを入力しました。

cboGridSize.Items.Clear();
for (int i = 2; i <= 12; i++)
    cboGridSize.Items.Add(new KeyValuePair<string,int>(i.ToString(), i));
cboGridSize.SelectedValue = 4;

ただし、最後の行はまったく効果がありません。アイテムが選択されていない状態でComboBoxが表示されます。

だから私はいくつかのデバッグをしていて、いくつかの奇妙なことに気づきました。cboGridSize.SelectedIndex次の画像は、 0に設定した後のウォッチウィンドウからのものです。

ウォッチウィンドウhttp://www.softcircuits.com/Client/debugwin.jpg

SelectedItemプロパティには私が期待するものが正確に含まれていますが、それでもSelectedValueですnull。のドキュメントSelectedValueは哀れですが、選択したアイテムの値が含まれていることを理解しました(SelectedItem)。代わりに、2つのプロパティは完全に無関係のようです。誰かが私が間違っていることを見ることができますか?

ご覧のとおり、ValueMemberプロパティが設定されています。そして、DropDownStyleプロパティはに設定されDropDownListます。


編集:

Nikolay Khilがここで問題にまっすぐに私を設定した後(なぜそれをSelectedValueしないためのドキュメントが私を逃れるのか)、私は同じタスクを達成するために単に自分のコードを書くことにしました。誰かが興味を持っている場合に備えて、ここに投稿します。

static class ComboBoxHelper
{
    public static void LookupAndSetValue(this ComboBox combobox, object value)
    {
        if (combobox.Items.Count > 0)
        {
            for (int i = 0; i < combobox.Items.Count; i++)
            {
                object item = combobox.Items[i];
                object thisValue = item.GetType().GetProperty(combobox.ValueMember).GetValue(item);
                if (thisValue != null && thisValue.Equals(value))
                {
                    combobox.SelectedIndex = i;
                    return;
                }
            }
            // Select first item if requested item was not found
            combobox.SelectedIndex = 0;
        }
    }
}

これは拡張メソッドとして実装されているため、元のコードを次のように変更するだけです。

cboGridSize.Items.Clear();
for (int i = 2; i <= 12; i++)
    cboGridSize.Items.Add(new KeyValuePair<string,int>(i.ToString(), i));
cboGridSize.LookupAndSetValue(4);
4

4 に答える 4

24

ValueMemberとプロパティの両方が使用されるのは、プロパティが定義されDisplayMemberている場合のみです。DataSource

したがって、次のようにコードを書き直す必要があります。

private readonly BindingList<KeyValuePair<string, int>> m_items =
    new BindingList<KeyValuePair<string, int>>();

public YourForm()
{
    InitializeComponent();

    cboGridSize.DisplayMember = "Key";
    cboGridSize.ValueMember = "Value";
    cboGridSize.DataSource = m_items;

    for (int i = 2; i <= 12; i++)
        m_items.Add(new KeyValuePair<string,int>(i.ToString(), i));

    cboGridSize.SelectedValue = 4;
}

リンク:

于 2012-10-14T16:47:30.247 に答える