【发布时间】:2012-10-04 17:02:26
【问题描述】:
我有一个 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后的观察窗口。
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);
【问题讨论】: