DataGridView - установка отображаемого значения объекта в столбце

Я привязываю некоторую коллекцию к DataGridView . Коллекция содержит объекты KeyValuePair, где ключ - это строка, а значение - это объект моего класса Field . DataGridView отображает два столбца: один содержит ключ, а другой - значение. Значение ( объект поля ) отображается с помощью его метода ToString (). Но я бы хотел, чтобы он отображался с помощью свойства Name. Проблема в том, что столбец не содержит свойства DisplayMember .
Как я могу это сделать?

Изменить: я знаю, что могу переопределить ToString (), чтобы вернуть имя объекта, но я не хочу этого делать.

Ответов (2)

Решение

DataGridView (как и большинство прямых привязок на основе списков) может привязываться только к непосредственным свойствам элемента строки. Возможно, вы могли бы создать для этого фасадный объект? т.е. класс, который принимает экземпляр и возвращает имя как прямое свойство:

public string Name {
    get {return innerObject.Name;}
    set {innerObject.Name = value;}
}
// snipped: other properties - Key etc

В качестве альтернативы вы могли бы спроецировать в новый объект? Например, привязки данных хорошо работают (по крайней мере, только для чтения) с анонимными типами:

grid.DataSource = originalData.Select(x=>
    new {x.Key, Name = x.Field.Name}).ToList();

Наконец, вы можете взломать, ComponentModel чтобы выровнять модель во время выполнения, но на самом деле это того не стоит.

Вы можете перевести DataGridView в виртуальный режим (view.VirtualMode = true) и обработать события CellValueNeeded (и, возможно, CellValuePushing) для доступа к свойству «Name». Это позволит избежать создания большого количества объектов-оболочек, но сделает код несколько менее элегантным.