創建關系
在 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 事件處理程序中,將以下代碼添加到注釋“用數據填充表”與 daOrd
ers.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 文本框中將顯示產品名稱和詳細信息?,F在窗體中顯示來自所有四個表的相關數
據。
圖 2:顯示產品名稱和訂單明細的窗體
在列表框中選擇另一個訂單。RTF 文本框中的訂單明細將被更新。
關閉窗體。
新聞熱點
疑難解答