2009-02-24 3 views
3

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

Редактировать: Я знаю, что могу переопределить 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, чтобы сгладить модель во время выполнения, но это действительно ISN» Это стоит того.

+0

Да, я знаю, что это просто не следует использовать как это - я имею в виду, что datagridview должен просто отображать свойство объекта в столбце, но я надеялся, что есть какой-то способ справиться с этим. – agnieszka

0

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

Смежные вопросы