BaseRow属性可以返回RowData对象的底层绑定的DataRow对象。我们在之前的“RowData数据转换”中已经提到过,我们之所以会提供一个RowData对象出来,主要就是为了解决DataRow对象通过索引器返回的结果为空时数据转换比较麻烦的问题。另外一个再对DataRow对象作一些功能的补充。
当然,在常规的使用场景下,我们大可直接就使用RowData对象来读取行中的数据。但是,在一些对循环比较多,性能比较注重的场合,在赋值时我们可以考虑直接通过DataRow来读取。因为RowData返回的结果是经过处理的。一些空值会被转化成其他值。这种处理一是会影响性能,另外也会影响复制的结果。所以这时候我们就可以通过BaseRow属性来返回RowData对象进行读取数据。
Vb.Net |
'向当前表中添加一些数据 Dim tbl As SmGrid=Proj.CurrentSmGrid '通过SQL从数据库中获得数据 Dim dt As DataTableHelp=Proj.DatabaseForUserDB.ExecuteDataTableHelp("select * from tableName where ID>12") If dt IsNot Nothing AndAlso dt.DataRows.Count>0 Then '如果数据不为空 '遍历所有查询到的结果 For Each dr As RowData In dt.DataRows '在当前表中新增一行 Dim drNew As RowData=tbl.DataTableHelp.AddNew() '获得DataRow对象 Dim drOri As DataRow=dr.BaseRow '遍历所有列 For Each col As ColData In tbl.DataTableHelp.DataCols '如果当前表与查询到的结果中包含相同列名 If dt.DataCols.Contains(col.Name) Then '直接通过DataRow对象读取结果赋值给新增的RowData对象中。 '这时选择不直接通过dr(col.Name)读取结果,是因为RowData返回的结果是经过处理的。一些空值会被转化 drNew(col.Name)=drOri(col.Name) End If Next Next End If |
C# |
// 向当前表中添加一些数据 SmGrid tbl = Proj.CurrentSmGrid; // 通过SQL从数据库中获得数据 DataTableHelp dt = Proj.DatabaseForUserDB.ExecuteDataTableHelp("select * from tableName where ID>12"); if (dt != null && dt.DataRows.Count > 0) { // 遍历所有查询到的结果 foreach (RowData dr in dt.DataRows) { // 在当前表中新增一行 RowData drNew = tbl.DataTableHelp.AddNew(); // 获得DataRow对象 DataRow drOri = dr.BaseRow; // 遍历所有列 foreach (ColData col in tbl.DataTableHelp.DataCols) { // 如果当前表与查询到的结果中包含相同列名 if (dt.DataCols.Contains(col.Name)) { // 直接通过DataRow对象读取结果赋值给新增的RowData对象中。 // 这时选择不直接通过dr(col.Name)读取结果,是因为RowData返回的结果是经过处理的。一些空值会被转化 drNew[col.Name] = drOri[col.Name]; } } } } |
本身RowData并不是从DataRow继承,也并没有实现DataRow对象的所有功能,只是把一些数据处理相关的常用功能实现,并添加了一些其他相关功能。如果想用DataRow本身的方法处理一些数据也是可以的。因为RowData的本质就是将DataRow对象打包引用,本身的所有方法功能本身也是对此BaseRow属性返回的DataRow进行处理。
如果我们想通过DataRow对象获得对RowData对象的引用的话,可以直接通过扩展函数 GetRowData()来获得。