我有一个名为Tuple的简单类。看起来像这样:
class tuple
{
string name;
string code
}
我将这些项目中的一些插入到组合框中,现在当我想通过代码选择一些项目时,我试着写
myComboBox.selectedItem = new tuple("Hello" , "5");
当然它根本不起作用,所选项目不会改变。
让我们假设组合框的项目列表包含一个看起来像这样的项目,他如何比较这些项目?
我继承了iComparable并实现了它,但遗憾的是他根本没有使用它..
如何设置所选项目?我应该用循环运行所有项目并自己比较它们吗?
感谢
答案 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
的信息: