ComboBox.SelectedValue不起作用

Jon*_*ood 9 c# combobox winforms

我有一个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;
Run Code Online (Sandbox Code Playgroud)

但是,最后一行绝对没有效果.出现ComboBox时未选择任何项目.

所以我正在做一些调试,并注意到一些奇怪的事情.设置cboGridSize.SelectedIndex为0 后,以下图像来自观察窗口.

Watch Window http://www.softcircuits.com/Client/debugwin.jpg

即使该SelectedItem属性包含我所期望的,SelectedValue仍然是null.虽然文档SelectedValue是可悲的,但我知道它将包含所选项目的值(SelectedItem).相反,这两个属性似乎完全不相关.任何人都可以看到我错了吗?

如你所见,我有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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是作为扩展方法实现的,所以我只需更改我的原始代码如下:

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

Nik*_*hil 20

既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;
}
Run Code Online (Sandbox Code Playgroud)

链接:

  • 我注意到设置 SelectedValue 仅在设置了 DataSource 属性时才有效。如果您使用 comboBox.Items.Add 添加诸如 KeyValuePair 之类的项目,则设置 SelectedValue 不起作用。 (2认同)