0

WinFormsアプリケーションの次のシナリオでデータグリッドをバインドするための最良の戦略は何ですか。たとえば、テーブルを含む強く型付けされたデータセットがあるとします。

Table1 (T1_ID, T1_VALUE) <--* Table2 (T2_ID, T1_ID, T2_VALUE) <--* Table3(T3_ID, T2_ID, T3_VALUE)

データグリッドをTable3にバインドし、Table2とTable1のフィールドを表示し、すべての列でフィルタリング、並べ替える機能が必要です。

T3_VALUE | T2_VALUE | T1_VALUE

そのような場合の一般的なバインディングアプローチは何ですか?

次の選択肢があります。

  1. 計算列を追加します。
    Table2.T1_VALUE = PARENT(T2_T1).T1_VALUE
    Table3.T2_VALUE = PARENT(T3_T2).T2_VALUE
    Table3.T1_VALUE = PARENT(T3_T2).T1_VALUE
    ここで、T2_T1、T3_T2-リレーション名。
    これは正しい方法のようですが、UIの目的でのみ必要な冗長な計算列でクリーンなデータモデルを汚染することを懸念しています(コード内の他の場所ではまだ使用します)Table3Row.Table2Row.Table1Row.T1_VALUE

  2. Linqを使用してデータセットをクエリし、さまざまなテーブルから列を取得します。ただし、この場合、グリッドはデータをtable3に書き込んだり、並べ替えたりすることはできません。

  3. グリッドをTable3にバインドし、セルをレンダリングするイベントを処理し、そこで親テーブルから値を出力します。グリッドはTable3に書き込むことはできますが、並べ替えることはできません(syncfusionグリッドを使用していますが、違いはないと思います)

  4. 複数のテーブルのデータを表示できるビューを実装し、メインテーブルを更新します。私はこの方向に掘りませんでした、それはあまりにも複雑なようです。出来ますか?

私が指摘したように、計算列を使用するとすべての問題が解決され、それを解決する最も簡単な方法のようです。しかし、もっとエレガントで正しいアプローチがあるかもしれません。

4

2 に答える 2

0

私はしばしばオブジェクト指向の観点からこれらのことに気づきます。必要なすべてのプロパティを持つオブジェクトを作成し、それらのオブジェクトのコレクションにバインドします。双方向のデータバインディングが必要な場合は、ObservableCollectionを使用して、グリッドがコレクションへの変更を取得し、オブジェクトのプロパティにIPropertyChangedを実装できるようにすることができます。通常、テーブル1とテーブル2のプロパティは、オブジェクトでのみ読み取られます。

于 2012-07-12T13:35:21.690 に答える
0

Syncfusion GridGroupingControlを使用すると、UnboundFieldsコレクションはこの要件を簡単に達成するのに役立ちます。Table3はグリッドにバインドでき、他の2つのテーブルから参照する必要があるフィールドをUnboundFieldsとしてGridGroupingControlに追加できます。値は、 QueryValueイベントを処理することで入力できます。

//On Load of Windows Form
DataSet ds = new DataSet();
ds.Tables.AddRange(new DataTable[] { dt1, dt2, dt3 }); //dt1, dt2 and dt3 are Table1, Table2 and Table3 respectively
this.gridGroupingControl1.DataSource = ds.Tables[2]; // Table3 bounded
this.gridGroupingControl1.TableDescriptor.UnboundFields.Add("T1_VALUE"); // column from Table1
this.gridGroupingControl1.TableDescriptor.UnboundFields.Add("T2_VALUE"); // column from Table2
this.gridGroupingControl1.QueryValue += new Syncfusion.Grouping.FieldValueEventHandler(gridGroupingControl1_QueryValue);

実行時にこれらのフィールドに変更されたデータを保存できるようにする場合は、SaveValueイベントを追加で処理し、基になるデータ行を更新された値(QueryValueイベントコードの逆)で設定できます。

//Method Invoked to populate unbound fields with respective values
void gridGroupingControl1_QueryValue(object sender, Syncfusion.Grouping.FieldValueEventArgs e)
{
   if (e.Field.Name == "T1_VALUE")
      e.Value = dt1.Rows[e.Record.GetSourceIndex()][e.Field.Name];
   else if (e.Field.Name == "T2_VALUE")
      e.Value = dt2.Rows[e.Record.GetSourceIndex()][e.Field.Name];
}

これらのバインドされていないフィールドは、並べ替えとフィルタリングもサポートしています。

于 2012-07-18T17:56:00.533 に答える