在 ADO.NET 資料集中瀏覽多個相關表(6)

來源:互聯網
上載者:User
ado|資料 運算式列
  除了包含待用資料外,還可以基於運算式的結果為 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 集合中,可以對相關記錄中的值進行計算,合計和邏輯求值。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。