Почему в C # в выпадающем списке управления я не могу изменить свойство SelectedItem? - PullRequest
2 голосов
/ 10 сентября 2010

У меня есть простой класс под названием Tuple. который выглядит так:

class tuple
{
    string name;
    string code
}

Я вставил несколько этих элементов в выпадающий список, теперь, когда я хочу выделить в коде какой-то элемент, я пытаюсь написать

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

и, конечно, он вообще не работает, а выбранный элемент не меняется.

давайте предположим, что список элементов в выпадающем списке содержит элемент, который выглядит следующим образом, как он может сравнивать элементы?

Я унаследовал iComparable и реализовал его, но, к сожалению, он его вообще не использует ..

как я могу установить выбранный пункт? Должен ли я запустить все элементы с помощью цикла и сравнить их самостоятельно?

спасибо

Ответы [ 2 ]

3 голосов
/ 10 сентября 2010

Вам потребуется переопределить метод Equals, чтобы обеспечить пользовательское сравнение, которое может утверждать, если два экземпляра tuple представляют одно и то же значение.

Также следует проверить следующий MSDNзаписи о том, как правильно переопределить метод Equals:

Реализация метода равных

Рекомендации по реализации равных и оператора равенства (==)

Microsoft Code Analysis Правило о переопределении GetHashCode всякий раз, когда вы переопределяете Equals:

CA2218: переопределять GetHashCode при переопределении Равен

3 голосов
/ 10 сентября 2010

Значение, присвоенное SelectedItem, должно быть одним из элементов, которые уже существуют в источнике данных комбинированного окна. Из документации MSDN (выделено мной):

Когда вы устанавливаете свойство SelectedItem для объекта, ComboBox пытается сделать этот объект текущим выбранным в списке.Если объект найден в списке, он отображается в области редактирования ComboBox, и для свойства SelectedIndex устанавливается соответствующий индекс. Если объект не существует в списке, свойство SelectedIndex остается с его текущим значением .

С помощью:

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

вы пытаетесь назначить ему новый экземпляр кортежа , который, возможно, не может быть в связанном источнике данных.

Правильной реализацией было бы найти существующий элементв источнике данных (по любому критерию, который подходит для определения соответствия) и присвойте его SelectedItem.LINQ может сделать это довольно просто:

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

Кроме того, если вы используете .NET 4.0, вам не нужно реализовывать свой собственный класс кортежей, есть новая универсальная реализация Tuple<T1,T2>, в которую уже встроена семантика структурного равенства.

...