2012-07-10 64 views
0

在WinForms應用程序的以下場景中綁定數據網格的最佳策略是什麼? 讓說,我有表一個強類型數據集:將datagrid綁定到一個表並顯示來自父表的字段

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

我要綁定從表2和表1一個DataGrid,以表3和顯示領域,並具有過濾能力,排序的所有列:

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查詢冗餘計算列從不同的表 但在這種情況下,數據集,並得到列,電網將無法將數據寫入表3還排序。

  3. 綁定網格表3和處理是使細胞活動,並且輸出值父表格 網格可以寫入表格3,但無法排序(我正在使用syncfusion網格,但我認爲它沒有任何區別)

  4. 實現一個可以顯示多個表中的數據並更新主表的視圖。我沒有朝這個方向發展,這似乎太複雜了。可能嗎?

正如我所指出的,使用計算列可以解決所有問題,並且似乎是解決它的最簡單方法。但也許有更優雅和正確的方法。

+0

'我想將一個數據網格綁定到Table3,並顯示來自Table2和Table1的字段,並且能夠過濾,按所有列進行排序:' - > Create a View !! – 2012-07-10 16:45:57

+0

這在#4中提到。我不確定是否有可能。 – xll 2012-07-10 17:59:37

回答

0

使用Syncfusion GridGroupingControl,UnboundFields集合將幫助您輕鬆實現此要求。 Table3可以綁定到網格,並且需要從其他兩個表中引用的字段可以作爲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]; 
} 

這些未綁定的字段也支持排序和過濾。

+0

這不完全是我正在尋找,但這可能工作。 – xll 2012-08-17 16:50:17

0

我經常從面向對象的角度來看待這些事情。我將創建一個包含所有您想要的屬性並綁定到這些對象集合的對象。如果您需要雙向數據綁定,則可以使用ObservableCollection來允許網格獲取對集合的更改並在對象的屬性上實現IPropertyChanged。通常,表1和表2中的屬性只能在對象上讀取。

+0

我搜索了其他方法,並發現了BindingList的幾個實現,它支持排序和過濾。 但問題是常用的方法是什麼。我只是不想重新發明自行車。 – xll 2012-07-12 17:49:17

相關問題