【问题标题】:Setting ComboBox SelectedValue设置 ComboBox SelectedValue
【发布时间】:2017-10-02 14:52:42
【问题描述】:

我的 Winform ComboBox 是这样绑定的:

this.myComboBox.DataSource = myDS;
this.myComboBox.DisplayMember = PropertyHelper<MyType>.NameOf(i => i.prop1);
this.myComboBox.ValueMember = PropertyHelper<MyType>.NameOf(i => i.prop2);

myDS 确实包含一个 MyType 元素,其 prop2 值 = myType.prop2val

我正在尝试使用此项目设置 Combobox 项目。 第一次尝试:

myComboBox.SelectedValue = (int)myType.prop2val;

这不起作用:它将myComboBox.SelectedValueSelectedItem 设置为null。

第二次尝试:

myComboBox.SelectedItem = ((List<MyType>)myComboBox.DataSource)
                         .FirstOrDefault(a => a.prop2 == myType.prop2val);

这条线可行,但我觉得它很难看。

我很确定我错过了一些让第一次尝试成功的东西。 任何帮助表示赞赏。

【问题讨论】:

  • 你是否包含了 this.myComboBox.DataBind(); ?
  • myComboBox.SelectedItem = myType.prop2val;
  • @Alander,WebForms 不是 DataBind() 吗?
  • 组合框列出了DS的所有元素,只是没有在第一行代码中设置正确的元素。
  • myType.prop2val 的类型是什么?

标签: c# winforms data-binding


【解决方案1】:

您的问题最明显的原因是myType.prop2 的类型和myComboBox.SelectedValue 中给出的值类型是不同的类型。

正如您在 MyType.prop2 的 cmets 类型中所说,long,但对于 SelectedValue,您将值转换为 int

myComboBox.SelectedValue = (int)myType.prop2val;

我不明白您为什么需要将其转换为int,但无论如何ValueMember 中的属性类型和SelectedValue 中的类型应该相同以满足相等性。

ComboBox 将值作为object 类型的值进行比较,因此long 类型的装箱值将不等于int 类型的装箱值。
ComboBox 比较代码如下所示

int givenSelectedValue = 2;

object selectedValue = givenSelectedValue;  // boxed to object type
for (int i = 0; i < internalDataSourceList.Count; i++) 
{
    object itemValue = // get value of list[i] and property from ValueMember
    if (selectedValue.Equals(itemValue)) 
    {
        return i; // Return index of selected item
    }
}

// if not found
return -1;

【讨论】:

  • 是的!我不知道为什么我第一次设置了这个错误的演员表。我删除了它,它就像一个魅力。感谢一吨法比奥!
猜你喜欢
  • 2018-01-09
  • 2018-05-24
  • 2017-11-02
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多