Прежде всего, спасибо, Адам Робинсон, я уверен, что ваш ответ был правильным, но я просто не хотел этого слышать. Я решил свою проблему по-другому, и я думаю, что она может быть полезна кому-то еще, поэтому я публикую ее здесь.
То, что я сделал, я создал новый класс, в моем случае я назвал его ListObject, у которого было свойство DataRow (как вы увидите позже, оно работает и для других типов, я просто использовал это, так как это то, что я на самом деле хотел как мое свойство значения элемента). Также переопределяет методы:
- String ToString ()
- bool Equals (объектный объект)
- int GetHashCode () - в моем случае не требуется, однако Visual Studio
предупреждает вас, что это должно быть отменено.
Идея заключалась в том, что я мог бы заполнить коллекции ComboBox.Items объектами своего собственного класса, отобразить пользовательскую строку (если бы я не работал так, мой следующий вопрос о переполнении стека, вероятно, был бы о настройке DisplayMembers при чтении элементы из DataRow) и сравнить только один элемент класса (в моем случае DataRow).
Итак, вот код, и он прекрасно работает (по крайней мере, для того, что я хотел с ним сделать).
public class ListObject
{
public DataRow element;
public String DisplayObject = null;
public ListObject(DataRow dr)
{
element = dr;
}
public ListObject(DataRow dr, String dspObject)
{
element = dr;
DisplayObject = dspObject;
}
public override String ToString()
{
if (DisplayObject == null) throw new Exception("DisplayObject property was not set.");
return element[DisplayObject].ToString();
}
public override bool Equals(object obj)
{
if (obj.GetType() == typeof(ListObject))
return Equals(((ListObject)obj).element, this.element);
else return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
В моем случае это прекрасно работает, так как я могу просто заполнить ComboBox оператором foreach:
dtUsers.ReadXml(Program.Settings.xmlInputUsers);
foreach(DataRow dr in dtUsers.Rows)
{
cmbUser.Items.Add(new ListObject(dr, "Name"));
}
И когда я получаю DataRow, который я хочу выбрать, я просто делаю это:
cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow);
Где мне не нужно беспокоиться о DisplayMember и т. Д., Потому что будут сравниваться только DataRow, и ваши параметры отображения будут по-прежнему устанавливаться с момента заполнения коллекции ComboBox.Items. Кроме того, поскольку метод toString переопределен, вы действительно можете настроить свой вывод.
Создание этого класса стало возможным только из-за статьи msdn Свойство ComboBox.SelectedItem , в котором было отмечено, что свойство SelectedItem работает с использованием метода IndexOf. Этот метод использует метод Equals для определения равенства.