Всякий раз, когда я это делаю, я обычно делаю grid.DataSource
результат проекции LINQ на объекты.
Так что-то вроде этого:
grid.DataSource = objects.Select(o => new
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
Хорошая вещь в том, что вы можете установить AutoGenerateColumns
истина, которая будет генерировать столбцы, основанные на свойствах проектируемых объектов.
Edit:
Единственным недостатком такого подхода является то, что при проектировании все в анонимный объект, вы можете иметь проблемы в ситуациях, когда нужно получить доступ к какому-либо объекту в случае щелчка, например.
В этом случае вам может быть лучше определить явную модель представления и проецировать ваши объекты на них. НАПРИМЕР,
class MyViewModel
{
public int Column1 { get;set; }
public int Column2 { get;set; }
}
grid.DataSource = objects.Select(o => new MyViewModel()
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
Edit 2:
MyViewModel
представляет все столбцы, которые вы хотите отобразить в DataGridView
. Разумеется, свойства примера должны быть переименованы в соответствии с тем, что вы делаете. В общем, точка ViewModel должна служить своего рода преобразователем, который опосредует между моделью (в вашем случае ваш список объектов) и представлением.
Если вы желаете, чтобы сохранить ссылку на основной объект, лучший способ может быть, чтобы поставлять его с помощью конструктора:
class MyViewModel
{
public int Column1 { get;set; }
public int Column2 { get;set; }
....
private SomeType _obj;
public MyViewModel(SomeType obj)
{
_obj = obj;
}
public SomeType GetModel()
{
return _obj;
}
}
grid.DataSource = objects.Select(o => new MyViewModel(o)
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
причина, почему я пошел на метод получения для извлечения основной модели объект просто избегает создания столбца для него.
Очень скользкий техника – John
Но с этим, как я скучаю эталонный объект или я не прав? –
@ Overflow012 Что вы подразумеваете под этим? –