在 ADO.NET 數據集中瀏覽多個相關表(6) | |||
作者: Microsoft www.ASPCool.com 時間:2003-1-23 17:40:06 閱讀次數:9727 | |||
除了包含靜態數據外,還可以基於表達式的結果爲 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.