【问题标题】:Why in C# , in the control combobox , i can't change the property SelectedItem?为什么在 C# 中,在控件组合框中,我无法更改 SelectedItem 属性?
【发布时间】:2011-04-10 12:12:08
【问题描述】:

我有一个名为 Tuple 的简单类。看起来像这样:

class tuple
{
    string name;
    string code
}

我在组合框中插入了一些这些项目,现在当我想通过代码选择一些项目时,我尝试编写

myComboBox.selectedItem = new tuple("Hello" , "5");

当然它根本不起作用,所选项目也不会改变。

假设组合框的项目列表包含一个看起来像这样的项目,他如何比较这些项目?

我继承了iComparable并实现了它,可惜他根本没有使用它..

如何设置所选项目?我应该循环运行所有项目并自己比较它们吗?

谢谢

【问题讨论】:

    标签: c# winforms list combobox selecteditem


    【解决方案1】:

    您需要重写 Equals 方法,以便提供能够断言两个 tuple 实例是否代表相同值的自定义比较。

    您还应该查看以下 MSDN 条目,了解如何正确覆盖 Equals 方法:

    Implementing the Equals Method

    Guidelines for Implementing Equals and the Equality Operator (==)

    关于覆盖 GetHashCode 时覆盖 Equals 的 Microsoft 代码分析规则:

    CA2218: Override GetHashCode on overriding Equals

    【讨论】:

    • 谢谢,它成功了。但是为什么 resharper 建议我还需要覆盖“GetHashCode”?
    • @OopsUser,它不仅是 Resharper,Microsoft FxCop 也会就此发出警告。我将使用有关此的信息更新我的答案。
    【解决方案2】:

    分配给 SelectedItem 的值必须是组合框数据源中已存在的项目之一。来自 MSDN 文档(强调我的):

    当您设置 SelectedItem 属性时 到一个对象,ComboBox 试图 使该对象成为当前 在列表中选择了一个。如果 在列表中找到对象,它是 显示在编辑部分 组合框和 SelectedIndex 属性设置为对应 指数。 如果对象不存在于 列表,SelectedIndex 属性 保留其当前值

    通过使用:

    myComboBox.SelectedItem = new tuple("Hello" , "5"); 
    

    您正在尝试为其分配一个元组的新实例,它不可能在关联的数据源中。

    正确的实现是在数据源中查找现有项目(通过任何适合定义匹配的标准)并将其分配给SelectedItem。 LINQ 可以让这变得非常简单:

    myComboBox.SelectedItem = 
         myComboBox.Items.OfType<tuple>()
                         .Where( t => t.name == "Hello" && t.code == 5 )
                         .FirstOrDefault();
    

    此外,如果您使用的是 .NET 4.0,则不必实现自己的元组类,有一个新的通用实现 Tuple&lt;T1,T2&gt;,它已经内置了结构相等语义。

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多