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で次のことを実行しても問題ないか(のように、許容できるベストプラクティスですか)です(「addedthis」を探してください)。

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

Equalをオーバーライドする必要はありません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 に答える