在ADO.NET數據集中瀏覽多個相關表(6)
2024-07-10 13:02:57
供稿:網友
表達式列
除了包含靜態數據外,還可以基于表達式的結果為 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 集合中,可以對相關記錄中的值進行計算,合計和邏輯求值。