views:

81

answers:

2

I have a simple class called Tuple. which looks like this :

class tuple
{
    string name;
    string code
}

i inserted few of these items into a combobox, now when i want to select through the code some item, i try to write

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

and of course it doesn't work at all and the selected item doesn't change.

let's assume the items list of the combobox contains an item that looks like this, how can he compare the items ?

i inherited iComparable and implemented it, but unfortunately he doesn't use it at all..

how can i set the selected item ? should i run an all the items with a loop and compare them by myself ?

thanks

+1  A: 

The value assigned to SelectedItem must be one of the items that already exists in the combo box data source. From the MSDN documentation (emphasis mine):

When you set the SelectedItem property to an object, the ComboBox attempts to make that object the currently selected one in the list. If the object is found in the list, it is displayed in the edit portion of the ComboBox and the SelectedIndex property is set to the corresponding index. If the object does not exist in the list, the SelectedIndex property is left at its current value.

By using:

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

you are attempting to assign it a new instance of a tuple, that can't possibly be in the associated data source.

The correct implementation would be to find the existing item in the data source (by whatever criteria is appropriate to define a match) and assign that to SelectedItem. LINQ can make this quite easy:

myComboBox.SelectedItem = 
     myComboBox.Items.OfType<tuple>()
                     .Where( t => t.name == "Hello" && t.code == 5 )
                     .FirstOrDefault();

Also, if you're using .NET 4.0, you don't have to implement your own tuple class, there's a new generic implementation Tuple<T1,T2> which already has structural equality semantics built into it.

LBushkin
+3  A: 

You'll need to override the Equals method in order to provide a custom comparison that is able to assert if two tuple instance represent the same value.

You should also check the following MSDN entries about how to properly override the Equals method:

Implementing the Equals Method

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

Microsoft Code Analysis Rule about overriding GetHashCode whenever you override Equals:

CA2218: Override GetHashCode on overriding Equals

João Angelo
Thanks, it worked.But why the resharper suggests that i need also to override "GetHashCode" ?
OopsUser
@OopsUser, its not only Resharper, Microsoft FxCop will also warn you about this. I'll update my answer to with information about this.
João Angelo