DataGridView でナビゲーション プロパティのプロパティを表示する (第 2 レベルのプロパティ)

次のいずれかのオプションを使用できます:

<オール>
  • 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 レベル プロパティにバインドする方法