2012-09-28 32 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上显示颜色? –