表达式列
除了包含静态数据外,还可以基于表达式的结果为 datacolumn 分配值。表达式是一个分配给 datacolumn.expression 属性的字符串。
当表达式与相关数据一同使用时,数据列可以包含:
相关数据列的计算所得值。
相关数据列的合计信息。
相关数据的逻辑比较结果。
为说明处理相关数据时的值表达式列,我们将针对每种使用情况介绍一个示例,并添加到 datarelationexample 应用程序中。
添加包含计算值的表达式列
计算的列包含数学运算结果。可以从现有的列中取值进行计算。订单明细表中将添加一个名为 total 的新列,它将包含由表达式 unitprice * quantity 返回的值(订单的总计美元值)。
添加表达式列
在 solution explorer(解决方案资源管理器)中,右键单击 form1 并从快捷菜单中选择 view code(查看代码)。
将以下代码添加到 form1_load 事件处理程序中已有代码之上:
visual basic
在订单明细表中创建名为 total 的表达式列。
dim dctotal as datacolumn = new datacolumn(“total”)
dctotal.datatype = system.type.gettype(“system.decimal”)
dctotal.expression = “unitprice * quantity”
dsnorthwind1.order_details.columns.add(dctotal)
// c#
// 在订单明细表中创建名为 total 的表达式列。
datacolumn dctotal = new datacolumn(“total”);
dctotal.datatype = system.type.gettype(“system.decimal”);
dctotal.expression = “unitprice * quantity”;
dsnorthwind1.order_details.columns.add(dctotal);
运行应用程序。
在列表框中选择一个订单,
检查 rtf 文本框中的订单明细,并注意每个记录都有一个新的 total 列,显示 unitprice 和 quantity 字段的乘积。
关闭窗体。
添加包含合计信息的表达式列
expression 属性支持几个合计功能(sum、avg、count 等)。有关详细信息,请参阅 datacolumn.expression 属性。
为演示如何生成合计信息,需要在订单表中添加一个名为 ordertotal 的新列。此列将使用 sum 功能,根据在列表框 (lborders) 中选定的订单返回所有子订单明细记录的总计美元值。然后,该值将显示在 rtf 文本框中每个订单明细的上方。
创建 ordertotal 列
在 solution explorer(解决方案资源管理器)中,右键单击 form1 并从快捷菜单中选择 view code(查看代码)。
在 form1_load 事件处理程序中,将以下代码添加到在订单明细表中创建 total 列的代码的下方:
visual basic
在订单表中创建名为 ordertotal 的表达式列。
dim dcordertotal as datacolumn = new datacolumn(“ordertotal”)
dcordertotal.datatype = system.type.gettype(“system.decimal”)
dcordertotal.expression = “sum(child.total)”
dsnorthwind1.orders.columns.add(dcordertotal)
// c#
// 在订单表中创建名为 ordertotal 的表达式列。
datacolumn dctotal2 = new datacolumn(“ordertotal”);
dctotal2.datatype = system.type.gettype(“system.decimal”);
dctotal2.expression = “sum(child.total)”;
dsnorthwind1.orders.columns.add(dctotal2);
将合计信息显示在所有订单明细的上方
在 lborders_selectedindexchanged 事件处理程序中,将以下代码添加到 dim details as string = “” 或 string details = “” 行之下:
visual basic
details = “订单总计: ” & string.format(“{0:c}”, _
dsnorthwind1.orders.findbyorderid(ctype(lborders.selecteditem, _
integer))(“ordertotal”)) & controlchars.crlf
// c#
details = “订单总计: ” +
string.format(“{0:c}”,dsnorthwind1.orders.findbyorderid
((int)lborders.selecteditem)[“ordertotal”]) + “\n”;
运行应用程序。
在列表框中选择一个订单,
请注意,选定订单的所有订单明细的总计金额将显示在 rtf 文本框中的第一行。
在列表框中选择另一个订单,将更新显示以反映新选择的订单。
关闭窗体。
添加包含逻辑求值的表达式列
expression 属性可以基于其他列中的计算值来填充某个数据列。例如,订单表中的 ordersize 列可以包含值“big”(如果订单总额大于 1000)或者“small”(如果订单总额小于 1000)。
为演示这类表达式,需要在 datarelationexample 应用程序中添加代码以执行以下操作:
在订单表中添加名为 ordersize 的数据列。
根据相关订单明细的值来填充 ordersize 列。
在 rtf 文本框的顶部同时显示 ordersize 列的值和 ordertotal 的值。
添加创建 ordersize 列的代码
在 solution explorer(解决方案资源管理器)中,右键单击 form1 并从快捷菜单中选择 view code(查看代码)。
在 form1_load 事件处理程序中,将以下代码添加到在订单表中创建 ordertotal 列的代码的下方:
visual basic
在订单表中创建名为 ordersize 的表达式列。
dim dcordersize as datacolumn = new datacolumn(“ordersize”)
dcordersize.datatype = system.type.gettype(“system.string”)
dcordersize.expression = “iif(sum(child.total)<1000,small,big)”
dsnorthwind1.orders.columns.add(dcordersize)
// c#
// 在订单表中创建名为 ordersize 的表达式列。
datacolumn dcordersize = new datacolumn(“ordersize”);
dcordersize.datatype = system.type.gettype(“system.string”);
dcordersize.expression = “iif(sum(child.total)<1000,small,big)”;
dsnorthwind1.orders.columns.add(dcordersize);
显示 ordersize 的值
在 lborders_selectedindexchanged 事件处理程序中,将以下代码添加到第一个 for each 行的上方:
visual basic
details &= ” (” & ctype(dsnorthwind1.orders.findbyorderid _
(ctype(lborders.selecteditem, integer))(“ordersize”), string) & “)” _
& controlchars.crlf
// c#
details += ” (” + dsnorthwind1.orders.findbyorderid
((int)lborders.selecteditem)[“ordersize”] + “)\n”;
运行应用程序。
在列表框中选择一个订单。
检查 rtf 文本框中的第一行。选定订单的 ordersize 将显示在 ordertotal 的右侧。
在列表框中选择另一个订单,将更新显示以反映新选择的订单。
从 debug(调试)菜单中,选择 stop debugging(停止调试)。
有关相关表的其他信息
这里有必要提及一些其他信息以丰富本文的内容。
填充相关数据表的顺序非常重要
相关数据表的填充顺序对数据的输出有很大影响,因此必须在设计应用程序时予以考虑。例如,请注意最后一个填充的客户表的情况。当填充客户表时,组合框将填充客户名称值。填充组合框时,会引发 selectedindexchanged 事件。这将执行事件处理程序中的代码。由于尚未填充订单表,getchildrows 方法将返回零 (0) 个记录,窗体的标题将显示错误信息。试一试:更改代码以首先填充客户表,并运行应用程序。窗体的标题显示 alfki 的零 (0) 个订单,这是不正确的。
返回相关记录的特定版本
通过将所需的 datarowversion 作为第二个(可选的)参数传递给 getchildrows 或 getparentrow 方法,可以返回数据行的特定版本。以该应用程序为例,如果只想查看特定客户的原始订单,可以将组合框的 selectedindexchanged 事件中的代码更改为类似如下的代码。由于此应用程序中的数据并未更改,以下代码不会产生明显的效果,这里只是作为一个说明。
visual basic
只用选定客户的原始子行
填充数组。
dim draorders as datarow() = dsnorthwind1.customers.findbycustomerid _
(cbcustomers.selectedvalue.tostring()).getchildrows _
(“customersorders”, datarowversion.original)
// c#
// 只用选定客户的原始子行
// 填充数组。
datarow draorders = dsnorthwind1.customers.findbycustomerid
(cbcustomers.selectedvalue.tostring()).getchildrows
(“customerorders”, datarowversion.original);
总结
要访问特定数据行的相关记录,可以调用该行的 getchildrows 或 getparentrow 方法,以传递连接该数据行及其相关记录的数据关系。然后,便可以通过检查由该方法调用返回的数据行(或数据行数组)来访问相关的记录。
通过为 datacolumn.expression 属性分配一个有效的表达式字符串并将数据列添加到相应的 datatable.columns 集合中,可以对相关记录中的值进行计算,合计和逻辑求值。
在 ADO.NET 数据集中浏览多个相关表(6)-.NET教程,数据库应用
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 在 ADO.NET 数据集中浏览多个相关表(6)-.NET教程,数据库应用
相关推荐
-      DataGrid中的按钮反选事件与NamingContainer(命名容器)-downmoon-ASP教程,数据库相关
-      根据数据表中数据,生成Powerpoint幻灯片-ASP教程,数据库相关
-      使用用VB处理MYSQL数据库中二进制数据问题-.NET教程,VB.Net语言
-      关于DataGridView中如何接收处于编辑状态下的当前信息-ASP教程,数据库相关
-      ActiveMQ4.1+Spring2.0的POJO JMS方案(上)-.NET教程,数据库应用
-      ASP.NET 2.0中直接将Access数据库导入到Excel文件中-.NET教程,Asp.Net开发
-      DataGrid的多行提交-.NET教程,数据库应用
-      一个简单的asp数据库操作类-ASP教程,数据库相关