首先感谢亚当罗宾逊,我相信你的回答是正确的,但这不是我想听到的。我以不同的方式解决了我的问题,我认为这对其他人可能有用,所以我在这里发布。
我做的是我创建了一个新类,在我的例子中,我将它命名为ListObject,它有一个DataRow属性(稍后您会看到它也适用于其他类型,我只是使用它,因为这是我实际上作为我的Item值属性)。还重写方法:
- 字符串的ToString()
- 布尔等于(obj对象)
- INT GetHashCode()方法--is不需要在我的情况,但是Visual Studio的
警告你应该覆盖。
的想法是,我可以填补我自己的类的对象ComboBox.Items集合,显示自定义字符串(如果我没有算出来这个样子,我的堆栈溢出的下一个问题可能会是有关自定义DisplayMembers从DataRow中读取项目时)和比较只有一个类的项目(在我的情况下DataRow)。
因此,这里的代码,它的伟大工程(至少我想要用它做)。
public class ListObject
{
public DataRow element;
public String DisplayObject = null;
public ListObject(DataRow dr)
{
element = dr;
}
public ListObject(DataRow dr, String dspObject)
{
element = dr;
DisplayObject = dspObject;
}
public override String ToString()
{
if (DisplayObject == null) throw new Exception("DisplayObject property was not set.");
return element[DisplayObject].ToString();
}
public override bool Equals(object obj)
{
if (obj.GetType() == typeof(ListObject))
return Equals(((ListObject)obj).element, this.element);
else return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
对我来说,它的伟大工程,因为我可以只填写组合框与foreach语句:
dtUsers.ReadXml(Program.Settings.xmlInputUsers);
foreach(DataRow dr in dtUsers.Rows)
{
cmbUser.Items.Add(new ListObject(dr, "Name"));
}
当我得到的DataRow我要选择我只是这样做:
cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow);
在哪里,我不担心将DisplayMember等,因为只有DataRow中的进行比较,你的显示参数仍然会从您填写ComboBox.Items收集组。另外,由于toString方法被覆盖,你可以真正定制你的输出。
创建这个类是唯一可能的,因为msdn上的文章ComboBox.SelectedItem属性其中注意到SelectedItem属性使用IndexOf方法工作。此方法使用Equals方法来确定相等性。