2012-09-28 34 views
2

我只需要一點點確認只選擇價值...C#的WinForms組合框 - 從對象

我填我的組合框,如下所示:

myCombo.Items.Add(new ComboBoxInt32Data("Red", 0)); 
myCombo.Items.Add(new ComboBoxInt32Data("Green", 1)); 
myCombo.Items.Add(new ComboBoxInt32Data("Yellow", 2)); 
myCombo.Items.Add(new ComboBoxInt32Data("Blue", 3)); 

現在,當我檢索來自數據庫表的值,我只有整數值。

我被覆蓋的的Equals長得很如何MSDN suggests

public override bool Equals(object obj) 
{ 
    if (obj == null) 
    { 
     return false; 
    } 

    ComboBoxInt32Data data = obj as ComboBoxInt32Data; 
    if ((object)data == null) 
    { 
     return false; 
    } 

    return (m_Name.ToUpper() == data.Name.ToUpper() && m_Value == data.Value); 
} 

但是,正如我所說,我剛纔的價值。我不希望有去做到以下幾點:

Int32 DatabaseValue = SomeFunctionThatRetrivedMeThisIntValueFromDB(); 
string TheValueName = SomeFunctionThatDoesALookUpToGetTheName(DatabaseValue); 
myCombo.SelectedIndex = myCombo.Items.IndexOf(new ComboBoxInt32Data(TheValueName, DatabaseValue)); 

我寧願只做到以下幾點:

myCombo.SelectedIndex = myCombo.Items.IndexOf(SomeFunctionThatRetrivedMeThisIntValueFromDB()); 

所以,我確認是,那是正確的(如,它是一個可以接受的最佳實踐)做我等於以下(尋找「加這個」):

public override bool Equals(object obj) 
{ 
    if (obj == null) 
    { 
     return false; 
    } 

    // added this 
    if (obj is Int32) 
    { 
     Int32 value = (Int32)obj; 
     return m_Value == value; 
    } 

    ComboBoxInt32Data data = obj as ComboBoxInt32Data; 
    if ((object)data == null) 
    { 
     return false; 
    } 

    return (m_Name.ToUpper() == data.Name.ToUpper() && m_Value == data.Value); 
} 

謝謝!

回答

4

你並不需要重寫EqualGetHashCode,最簡單的方式是ComboBoxInt32Data和使用LINQ選擇項:

myCombo.SelectedItem = myCombo.Items.Cast<ComboBoxInt32Data>() 
          .SingleOrDefault(item => item.Value == databaseValue); 
+0

這正是我問這個問題的原因。這看起來很酷。看起來我不必像我那樣修改Equals,而是可以像這樣搜索它。 (當我說話時,比較我腦中的兩個人)。謝謝回覆! – JustLooking

+0

@Cuong +1爲優雅的解決方案,但你不同意整體解決方案不是最好的解決方案?看看我的答案,並告訴我是否脫離基地。 –

+0

@Mike - 是的,我想看到一個討論,正如我提到的,我們避免數據綁定組合。也許這是一個糟糕的決定。 – JustLooking

2

嘗試以下操作:

var indexToSelect = SomeFunctionThatRetrievedMeThisIntValueFromDB(); 
var selectedItem = myCombo.Items 
    .Cast<ComboBoxInt32Data>() 
    .FirstOrDefault(item => item.Value == indexToSelect); 
if (selectedItem != null) 
{ 
    myCombo.SelectedItem = selectedItem; 
} 
+0

真棒的答案和Cuong Le類似。我會看看兩者。感謝您的時間,我很感激。 – JustLooking

3

我不知道我是否只是誤解了你的需求,或者如果我真的看到我認爲我看到的是什麼,但我認爲我可以相當簡化你的解決方案。讓我們以一個非常簡單的例子 - 我有一個表命名FooTypes,它包含了這樣的數據:

Id  Name    Order 
----------------------------------- 
1   Type 1    1 
2   Type 2    2 
3   Type 3    4 
4   Type 4    3 

現在我想加載與數據組合框,所以我會做這樣的事* *:

var conn = new SqlConnection("some connection string"); 
var da = new SqlDataAdapter("SELECT Id, Name FROM FooTypes ORDER BY Order", conn); 
var dt = new DataTable(); 

da.Fill(dt); 

comboBox.ValueMember = "Id"; 
comboBox.DisplayMember = "Name"; 
comboBox.DataSource = dt; 

comboBox.SelectedValue = SomeFunctionThatRetrivedMeThisIntValueFromDB(); 

**請記住,這是一個示例,因此您可以從其他位置獲取連接和內容。

+0

也許這只是幾年前編程經驗中的猶豫(當時發現的潛在問題現在不公平地阻止我們現在這樣做),但由於某種原因,我在這裏工作的「最佳實踐」是不對數據綁定組合。非常棒的例子,謝謝你的回答! – JustLooking

+0

@JustLooking,對不起,他們反對它,但我很想聽到反對數據綁定的論點。我說這是因爲我也一直在寫軟件超過十二年,並且還沒有找到一個反對它的理由。謝謝!! –

+0

@Mike:這樣,你如何在UI上顯示顏色? –