为什么在C#中,在控制组合框中,我无法更改属性SelectedItem?

时间:2010-09-09 22:26:06

标签: c# winforms list combobox selecteditem

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

class tuple
{
    string name;
    string code
}

我将这些项目中的一些插入到组合框中,现在当我想通过代码选择一些项目时,我试着写

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

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

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

我继承了iComparable并实现了它,但遗憾的是他根本没有使用它..

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

感谢

2 个答案:

答案 0 :(得分:3)

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

  

设置SelectedItem属性时   对于一个对象,ComboBox试图   使该对象成为当前的对象   在列表中选择一个。如果   对象在列表中找到,它是   显示在编辑部分   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<T1,T2>已经内置了结构相等语义。

答案 1 :(得分:3)

您需要覆盖Equals方法,以便提供自定义比较,如果两个tuple实例表示相同的值,则可以断言。

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

Implementing the Equals Method

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

Microsoft代码分析规则有关覆盖GetHashCode时覆盖Equals的信息:

CA2218: Override GetHashCode on overriding Equals