2010-09-09 30 views
2

我有一個簡單的類Tuple。它看起來像這樣:爲什麼在C#中,在控件組合框中,我無法更改屬性SelectedItem?

class tuple 
{ 
    string name; 
    string code 
} 

我插入幾個這樣的項目爲組合框,現在,當我想通過代碼來選擇一些項目,我試着寫

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

,當然它doesn根本不工作,選定的項目不會改變。

讓我們假設組合框的項目列表包含一個看起來像這樣的項目,他如何比較項目?

我繼承了IComparable和實施,但遺憾的是他並沒有在所有使用它..

如何設置選定的項目?我應該運行一個循環的所有項目,並自己比較它們嗎?

感謝

回答

3

如果兩個tuple實例表示相同的值,您將需要覆蓋Equals方法以提供可以斷言的自定義比較。

您也應該檢查有關如何正確重寫Equals方法下面的MSDN項:

Implementing the Equals Method

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

微軟代碼分析規則有關重寫GetHashCode每當你覆蓋Equals

CA2218: Override GetHashCode on overriding Equals

+0

謝謝,它工作。 但爲什麼resharper暗示我還需要重寫「GetHashCode」? – OopsUser 2010-09-10 08:45:57

+0

@OopsUser,它不僅是Resharper,Microsoft FxCop也會對此提出警告。我會更新我的答案,並提供有關這方面的信息。 – 2010-09-10 08:52:29

+0

參見http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/ – 2014-05-06 16:27:04

3

分配給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<T1,T2>已經有內置結構相等語義進去。

相關問題