ComboBox.SelectedValue不起作用

时间:2012-10-14 15:12:05

标签: c# winforms combobox

我有一个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后,以下图像来自观察窗口。

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

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

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

4 个答案:

答案 0 :(得分:18)

仅在定义ValueMember属性时才使用DisplayMemberDataSource属性。

因此,您应该按如下方式重新编写代码:

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

链接:

答案 1 :(得分:0)

我知道这是一个老问题,但我自己也遇到过这个问题。我用以下方法解决了 - 它有点hacky但它​​有效:

chart

希望这有助于某人。

答案 2 :(得分:0)

这不能回答OP,但是... ComboBox SelectedValue必须是整数类型。

如果您拥有一个简短的或字节的var值,该值包含将设置SelectedValue的值,则它将不起作用-您将获得null / nothing值。

使用整数。

答案 3 :(得分:-2)

你可以先设置SelectedValue,然后设置Datasource和其他