我有一个 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);