在 ADO.NET 數據集中瀏覽多個相關表(5)

在 ADO.NET 數據集中瀏覽多個相關表(5)
作者: Microsoft   www.ASPCool.com 時間:2003-1-23 17:39:24  閱讀次數:6716

    
  創建關係
  
  在 Solution Explorer(解決方案資源管理器)中,雙擊 dsNorthwind.xsd 文件。文件將在 XML Designer(XML 設計器)中打開。
  從工具欄的 XML Schema(XML 架構)選項卡中,將 Relation(關係)拖到訂單表上。
  在 Edit Relation(編輯關係)對話框中,設置以下屬性:
  
  元素 設置
  Name CustomersOrders
  Parent Customers
  Child Orders
  Key Fields CustomerID
  Foreign Key Fields CustomerID
  
  
  單擊 OK(確定)以創建關係並關閉對話框。
  從工具欄的 XML Schema(XML 架構)選項卡中,將 Relation(關係)拖到訂單明細表上。
  在 Edit Relation(編輯關係)對話框中,設置以下屬性:
  
  元素 設置
  Name OrdersOrderDetails
  Parent Orders
  Child OrderDetails
  Key Fields OrderID
  Foreign Key Fields OrderID
  
  
  單擊 OK(確定)以創建關係並關閉對話框。
  從工具欄的 XML Schema(XML 架構)選項卡中,將 Relation(關係)拖到訂單明細表上。
  在 Edit Relation(編輯關係)對話框中,設置以下屬性:
  
  元素 設置
  Name ProductsOrderDetails
  Parent Products
  Child OrderDetails
  Key Fields ProductID
  Foreign Key Fields ProductID
  
  
  單擊 OK(確定)以創建關係並關閉對話框。
  保存項目。
  訂單明細表和產品表已被添加到數據集中,但是您仍需要添加代碼,以便在運行時用數據來填充它們。
  
  用數據填充表
  
  在 Solution Explorer(解決方案資源管理器)中,右鍵單擊 Form1 並從快捷菜單中選擇 View Code(查看代碼)。
  在 Form1_Load 事件處理程序中,將以下代碼添加到註釋“用數據填充表”與 daOrders.Fill(dsNorthwind1) 行之間:
  
  ' Visual Basic
  daOrderDetails.Fill(dsNorthwind1)
  daProducts.Fill(dsNorthwind1)
  // C#
  daOrderDetails.Fill(dsNorthwind1);
  daProducts.Fill(dsNorthwind1);
  
  
  
  用數據填充 RTF 文本框
  現在您要爲項目添加代碼,以便在列表框中選定某個訂單時,可以在 RTF 文本框中顯示所有訂單明細。
  
  以下代碼將基於列表框中的選定訂單調用 GetChildRows 方法。訂單明細表中的所有相關記錄都將分配給名爲 draOrderDetails 的數據行數組。每個數據行的內容將顯示在 RTF 文本框中。
  
  注意:請注意嵌套的 For Each 循環是如何首先選取一個數據行,然後在該數據行的所有列中循環以訪問整個相關記錄的。
  設置 RTF 文本框以顯示所有訂單明細
  
  在 Solution Explorer(解決方案資源管理器)中,右鍵單擊 Form1 並從快捷菜單中選擇 View Designer(視圖設計器)。
  雙擊列表框爲列表框 lbOrders 的 SelectedIndexChanged 事件創建事件處理程序。
  添加以下代碼:
  
  ' Visual Basic
  Private Sub lbOrders_SelectedIndexChanged _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles lbOrders.SelectedIndexChanged
  ' 選擇新訂單時,清除 RTF 文本框。
  rtbDetails.Clear()
  ' 聲明一個用來保存選定的訂單 ID 的整數。
  Dim SelectedOrderID As Integer
  ' 將選定的項目設置爲整數。
  SelectedOrderID = CType(lbOrders.SelectedItem, Integer)
  
  ' 聲明一個用來保存選定訂單的記錄的數據行。
  Dim drSelectedOrder As DataRow
  drSelectedOrder = _
  DsNorthwind1.Orders.FindByOrderID(SelectedOrderID)
  
  ' 聲明一個用來保存相關記錄的數據行數組。
  Dim draOrderDetails() As DataRow
  draOrderDetails = _
  drSelectedOrder.GetChildRows("OrdersOrderDetails")
  
  Dim details As String = ""
  Dim drDetails As DataRow
  Dim dcDetails As DataColumn
  For Each drDetails In draOrderDetails
  For Each dcDetails In drDetails.Table.Columns
  details &= dcDetails.ColumnName & ": "
  details &= drDetails(dcDetails).ToString()
  details &= ControlChars.CrLf
  Next
  details &= ControlChars.CrLf
  Next
  rtbDetails.Text = details
  End Sub
  
  // C#
  private void lbOrders_SelectedIndexChanged
  (object sender, System.EventArgs e)
  {
  // 選擇新訂單時,清除 RTF 文本框。
  rtbDetails.Clear();
  
  // 聲明一個用來保存選定的訂單 ID 的整數。
  int SelectedOrderID;
  // 將選定的項目設置爲整數。
  SelectedOrderID = (int)lbOrders.SelectedItem;
  
  // 聲明一個用來保存選定訂單的記錄的數據行。
  DataRow drSelectedOrder;
  drSelectedOrder =
  dsNorthwind1.Orders.FindByOrderID(SelectedOrderID);
  
  // 聲明一個用來保存相關記錄的數據行數組。
  DataRow[] draOrderDetails;
  draOrderDetails =
  drSelectedOrder.GetChildRows("OrdersOrderDetails");
  
  string details = "";
  foreach(DataRow drDetails in draOrderDetails)
  {
  foreach(DataColumn dcDetails in drDetails.Table.Columns)
  {
  details += dcDetails.ColumnName + ": ";
  details += drDetails[dcDetails].ToString() + "/n";
  }
  details += "/n";
  }
  rtbDetails.Text = details;
  }
  
  
  
  保存項目。
  運行應用程序。
  在列表框中選擇一個訂單,其訂單明細將顯示在 RTF 文本框中。
  在列表框中選擇另一個訂單。RTF 文本框中的訂單明細將被更新。
  瀏覽多對多關係
  構成多對多關係的表通常通過保證數據完整性的第三方表進行連接。在羅斯文數據庫中,訂單表和產品表就是這樣相關的。因爲有些訂單可能包含很多產品,而有些產品又在很多訂單中銷售。這兩個表是通過訂單明細表連接的,訂單明細表利用這兩個表中的列建立自己特定的列,並使這些數據相關。瀏覽構成多對多關係的三個表與處理一對多關係的表並沒有太大區別。
  
  要瀏覽多對多關係,您可以基於訂單明細表中的單個記錄來訪問產品,這將返回產品名稱並顯示在訂單明細中。
  
  您可以使用 GetParentRow 方法從產品表中訪問產品名稱。調用 GetParentRow 方法將返回單個數據行,而調用 GetChildRows 方法將返回數據行數組(如上例所示)。
  
  從訂單明細記錄中獲取產品名稱
  
  在 Solution Explorer(解決方案資源管理器)中,右鍵單擊 Form1 並從快捷菜單中選擇 View Code(查看代碼)。
  在列表框 (lbOrders) 的 SelectedIndexChanged 事件處理程序中,將以下代碼添加到 For Each 行之間:
  
  ' Visual Basic
  details &= "產品名稱: " & _
  CType(drDetails.GetParentRow("ProductsOrderDetails") _
  ("ProductName"), String) & ControlChars.CrLf
  // C#
  details += "產品名稱: " +
  drDetails.GetParentRow("ProductsOrderDetails")["ProductName"]
  + "/n";
  
  
  
  保存項目。
  運行應用程序。
  在列表框中選擇一個訂單,
  RTF 文本框中將顯示產品名稱和詳細信息。現在窗體中顯示來自所有四個表的相關數據。
  
  fzhou20613_04.gif
  
  圖 2:顯示產品名稱和訂單明細的窗體
  
  在列表框中選擇另一個訂單。RTF 文本框中的訂單明細將被更新。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章