【问题标题】:ComboBox.SelectedValue is not WorkingComboBox.SelectedValue 不工作
【发布时间】: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);

【问题讨论】:

    标签: c# winforms combobox


    【解决方案1】:

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

    链接:

    【讨论】:

    • 感谢您提供缺失的部分。知道这一点,我可能不会采取你建议的方法。我可以自己做一个简单的查找。但我知道我错过了其中的一些元素,很高兴它终于被提供了。
    • 我注意到设置 SelectedValue 只有在设置了 DataSource 属性时才有效。如果使用 comboBox.Items.Add 添加 KeyValuePair 等项,则设置 SelectedValue 不起作用。
    【解决方案2】:

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

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

    使用整数。

    【讨论】:

      【解决方案3】:

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

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

      希望这对某人有所帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我试过了,但它对我不起作用。可以举个例子吗?
        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 2013-01-09
        • 2019-07-22
        • 2012-08-23
        • 1970-01-01
        • 2012-03-09
        • 2010-09-19
        相关资源
        最近更新 更多