これを行うときはいつでも、通常grid.DataSource
、オブジェクトに対する LINQ プロジェクションの結果を作成します。
だから、このようなもの:
grid.DataSource = objects.Select(o => new
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
良い点はAutoGenerateColumns
、投影されたオブジェクトのプロパティに基づいて列を生成する true に設定できることです。
編集:
このアプローチの 1 つの欠点は、すべてを匿名オブジェクトに射影することによって、たとえば、クリック イベントで特定のオブジェクトにアクセスする必要がある状況で問題が発生する可能性があることです。
この場合、明示的なビュー モデルを定義し、オブジェクトをそれらに投影する方がよい場合があります。例えば、
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();
編集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();
基になるモデル オブジェクトを取得するために getter メソッドを使用した理由は、単純に列が生成されないようにするためです。