次のいずれかのオプションを使用できます:
<オール>DataGridViewComboBoxColumn
を使用 Linq
を使用して、ナビゲーション プロパティのプロパティを含むようにクエリを整形します。 CellFormatting
を使用 サブプロパティの境界付き列の値を取得するイベントToString()
をオーバーライドして、オブジェクトの文字列表現を表示します TypeDescriptor
を使用する サブ プロパティへのデータ バインディングを有効にします。オプション 1 - DataGridViewComboBoxColumn を使用
使用法: このアプローチは、コントロールを編集可能にしたい場合に特に役立ちます。
このアプローチでは、 DataGridViewComboBoxColumn
を使用できます navigationn プロパティの任意のフィールドを表示します。グリッドでナビゲーション プロパティの複数のフィールド サブ プロパティを表示するには、複数の DataGridViewComboBoxColumn
を使用します 異なる DisplayMember
で同じナビゲーション プロパティにバインドされています
このアプローチでは、 ProductId
に加えて 列、さらに DataGridViewComboBoxColumn
を追加 グリッドに追加し、追加のすべてのコンボ列に対してこれらの設定を実行します:
DataPropertyName
を設定 それらのProductId
までDataSource
を設定します それらのプロパティを、メインProductId
に使用したのとまったく同じデータ ソースに 列、たとえばproductBindingSource
ValueMember
を設定 それらの商品 ID 列に設定した同じ値のメンバーに、それが商品テーブルのキー列です。(ProductId
)DisplayMember
を設定 たとえば、それらの 1 つを [名前] に設定します。 1 つは価格、1 つはサイズ、... .このようにして、関連するエンティティ フィールドを表示できます。ReadOnly
を設定 それらのプロパティをtrue
に .セルを読み取り専用にします。- 列を読み取り専用にしたい場合は
DisplayStyle
を設定してください それらのプロパティをNothing
に .ドロップダウン スタイルを削除します。
ProductId
を保持したい場合 編集可能、DisplayStyle
のまま それを DropDownButton
に .このように ProductId
の値を変更すると コンボボックスを使用して列を作成し、行を離れて次の行に移動すると、行の他のセルが表示され、選択した製品の他のプロパティが表示されます。また、他のコンボボックス列は読み取り専用であり、コンボボックス スタイルがないため、ユーザーはそれらの値を変更できず、関連エンティティの他のプロパティを表示する読み取り専用テキスト ボックス列のようにのみ機能します。
オプション 2 - 対応するプロパティを子エンティティの部分クラスに追加
使用法: このアプローチは、値を編集する必要がない場合に役立ちます。
このアプローチでは、親エンティティの対応するプロパティの子エンティティ部分クラスの戻り値でプロパティを定義できます。たとえば、製品名の場合、注文アイテムの部分クラスで次のプロパティを定義します:
public string ProductName
{
get
{
if (this.Product != null)
return this.Product.Name;
else
return string.Empty;
}
}
次に、注文項目を選択するときに製品を含めるだけで、グリッド列を注文項目の対応するプロパティにバインドできます。
オプション 3 - クエリを整形して、ナビゲーション プロパティのプロパティを含める
使用法: このアプローチは、値を編集する必要がない場合に役立ちます。
クエリを形成して、ナビゲーション プロパティのプロパティを含めることができます。匿名オブジェクトまたはビュー モードを簡単に使用できます。例:
var list = db.OrderDetails.Include("Products").Where(x=>x.OrderId==1)
.Select(x=> new OrderDetailVM() {
Id = x.Id,
ProductId = x.ProductId,
ProductName = x.Product.Name,
Price = x.Product.Price
}).ToList();
オプション 4 - CellFormatting イベントを使用して、サブ プロパティの境界付き列の値を取得する
使用法: このアプローチは、値を編集する必要がない場合に役立ちます。
このアプローチでは、 CellFormatting
を使用できます DataGridView
のイベント . e.Value
を設定するだけです 列インデックスに基づいています。例:
void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//I Suppose you want to show product name in column at index 3
if(e.RowIndex>=0 && e.ColumnIndex==3)
{
var orderLineItem= (OrderLineItem)(this.dataGridView1.Rows[e.RowIndex]
.DataBoundItem);
if (order!= null && orderLineItem.Product != null)
e.Value = orderLineItem.Product.Name);
}
}
さまざまな基準を使用して、さまざまな列を処理し、さまざまなサブ プロパティを表示できます。
また、リフレクションを使用して、より動的で再利用可能にすることもできます。リフレクションを使用して、ナビゲーション プロパティのサブ プロパティの値を抽出できます。そのためには、列を作成して DataPropertyName
を設定する必要があります Product.Name
のようなサブ プロパティに 次に CellFormatting
で イベント、リフレクションを使用して、列の値を取得します。このアプローチに関する Antonio Bello の優れた記事は次のとおりです。
- DataGridView:ネストされたオブジェクトをバインドする方法
オプション 5 - ToString()
をオーバーライドしてオブジェクトの文字列表現を表示する
使用法: このアプローチは、値を編集する必要がない場合に役立ちます。
ナビゲーション プロパティを 1 列だけ表示したい場合は、単純に ToString()
をオーバーライドできます。 ナビゲーション プロパティ クラスのメソッドを呼び出して、適切な値を返します。このようにして、そのタイプのプロパティをグリッドで表示すると、わかりやすいテキストが表示されます。たとえば、Product
の部分クラス 、あなたは書くことができます:
public override string ToString()
{
return this.Name;
}
オプション 6 - カスタム TypeDescriptor を使用して、サブ プロパティへのデータ バインディングを有効にする
使用法: このアプローチは、値を編集する必要がない場合に役立ちます。
このアプローチでは、第 2 レベルのプロパティへのデータ バインディングを実行できるカスタム TypeDescriptor を作成できます。このアプローチに関する Linda Liu による優れた記事は次のとおりです。
- DataGridView 列をデータ ソースの第 2 レベル プロパティにバインドする方法