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;

但是,最后一行绝对没有效果。组合框出现时未选择任何项目。

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

观看窗口 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

4 回答 4

24

只有在定义了属性时才使用和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;
}

链接:

于 2012-10-14T16:47:30.247 回答
1

然而,这并不能回答 OP……ComboBox SelectedValue 必须是整数类型。

如果您有一个短变量或字节变量,其中包含将设置 SelectedValue 的值,则它将不起作用 - 您将拥有 null/nothing 值。

使用整数。

于 2020-06-16T15:53:12.603 回答
0

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

        if(newVal != null)
        {
            MyComboBox.SelectedValue = newVal;
        }
        else
        {
            MyComboBox.SelectedIndex = 0; // the 'None Selected' item
        }

希望这可以帮助某人。

于 2017-06-23T15:45:55.397 回答
-2

可以先设置SelectedValue,再设置Datasource等

于 2014-02-11T08:14:11.623 回答