首先感謝亞當羅賓遜,我相信你的回答是正確的,但這不是我想聽到的。我以不同的方式解決了我的問題,我認爲這對其他人可能有用,所以我在這裏發佈。
我做的是我創建了一個新類,在我的例子中,我將它命名爲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方法來確定相等性。