在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
在这种情况下,常见的绑定方法是什么?
我看到以下替代方案:
添加计算列:
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
使用Linq查询数据集并从不同的表中获取列 但在这种情况下,网格将无法将数据写入table3并进行排序。
将网格绑定到Table3并处理呈现单元格的事件,并从那里输出父表中的值。 网格可以写入Table3,但无法排序(我使用的是syncfusion网格,但我认为它没有任何区别)
实现一个可以显示多个表数据的视图,并更新主表。我没有朝这个方向挖掘,看起来太复杂了。有可能吗?
正如我所指出的,使用计算列可以解决所有问题,并且似乎是解决问题的最简单方法。但也许有更优雅和正确的方法。
答案 0 :(得分:0)
我经常从面向对象的角度来看待这些事情。我将创建一个具有所需属性的对象,并绑定到这些对象的集合。如果需要双向数据绑定,可以使用ObservableCollection来允许网格获取对集合的更改并在对象的属性上实现IPropertyChanged。通常,表1和表2中的属性只能在对象上读取。
答案 1 :(得分:0)
使用Syncfusion GridGroupingControl, UnboundFields 集合将帮助您轻松实现此要求。 Table3可以绑定到网格,并且需要从其他2个表引用的字段可以作为UnboundField添加到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];
}
这些未绑定的字段也支持排序和过滤。