c# - ComboBox.SelectedValue 不工作

标签 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 后的监 window 口。

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

最佳答案

两者都是ValueMemberDisplayMember仅当 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;
}

链接:

关于c# - ComboBox.SelectedValue 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883478/

相关文章:

c# - NUnit - 不包括方法 c#

C# 十进制到数字(?,?)

c# - FolderBrowserDIalog 在 Win 2012 中不显示网络驱动器

C#:交换 winform 控件的正确方法是什么?

c# - 单击时不显示 XAML ComboBox DataTemplate 弹出窗口

c# - 连接尝试失败 HRESULT 异常 : 0x8007274C

c# - 使用 NHibernate 的自定义 Linq 生成器 (AddDays)

c# - 如何隐藏实时图表中的背景网格线?

delphi - Delphi中的组合框样式'csDropDownList'

c# - 如何禁用 ItemsSource 与 ComboBox 的 Text 属性同步