Неожиданное поведение, описанное в вопросе, определяется пользовательским чертежом ComboBox OwnerDrawn (пользовательский элемент управления, производный от ComboBox).
Когда DataSource ListControl является сложным объектом - как в этом случае, DataTable.DefaultView ( DataView ) - каждый элемент в списке являетсяСам сложный объект, DataRowView
здесь.
По этой причине при рисовании элементов ListControl OwnerDrawn (переопределяя метод OnDrawItem
) текст элемента, отображаемый в видимой области элемента управления, должен извлекаться с использованием GetItemText из ListControl. ) метод.
Этот метод извлекает текст элемента (используя внутренний Datamanager, если определен источник данных, или TypeDescriptor, если нет), независимо от типа элемента:
ЕслиСвойство DisplayMember не указано, значение, возвращаемое GetItemText (Object), является значением метода ToString элемента. В противном случае метод возвращает строковое значение члена, указанного в свойстве DisplayMember для объекта, указанного в параметре элемента.
.Net Исходный код ListControl.GetItemText ()
Классическая ошибка при рисовании текста Предмета для преобразования в строку объекта Предмета:
Это может работать, если текст Предмета является простой строкой, а не если это сложный объект. В этом случае [ComplexObject].ToString()
возвращает тип данных объекта (System.Data.DataRowView
, в данном случае).
protected override void OnDrawItem(DrawItemEventArgs e)
{
// (...)
e.DrawBackground();
using (var brush = new SolidBrush(this.ForeColor)) {
e.Graphics.DrawString(this.Items[e.Index].ToString()), this.Font, brush, e.Bounds);
}
// (...)
}
Упрощенный пример кода, не использовать:)
При использовании GetItemText()
возвращается значение свойства DisplayMember
как строкаНачиная с comboBox1.DisplayMember = "Display";
, он будет возвращать содержимое столбца DataTable Display
.
protected override void OnDrawItem(DrawItemEventArgs e)
{
// (...)
e.DrawBackground();
using (var brush = new SolidBrush(this.ForeColor)) {
e.Graphics.DrawString(this.GetItemText(this.Items[e.Index]), this.Font, brush, e.Bounds);
}
// (...)
}