2

我只需要一点确认...

我正在像这样填充我的组合框:

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 的建议完全相同:

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());

所以,我的确认是,在我的 Equals 中执行以下操作是否可以(如,这是一个可接受的最佳实践)(查找“添加这个”):

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

3 回答 3

4

您不需要覆盖Equaland GetHashCode,简单的方法是强制转换并使用 LINQ来ComboBoxInt32Data选择项目:

myCombo.SelectedItem =  myCombo.Items.Cast<ComboBoxInt32Data>()
                          .SingleOrDefault(item => item.Value == databaseValue);
于 2012-09-28T16:42:24.173 回答
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();

** 请记住,这是一个示例,因此您可以从其他地方获取连接和内容。

于 2012-09-28T16:44:34.303 回答
2

尝试以下操作:

var indexToSelect = SomeFunctionThatRetrievedMeThisIntValueFromDB();
var selectedItem = myCombo.Items
    .Cast<ComboBoxInt32Data>()
    .FirstOrDefault(item => item.Value == indexToSelect);
if (selectedItem != null)
{
    myCombo.SelectedItem = selectedItem;
}
于 2012-09-28T16:44:23.260 回答