创建关系
在 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 文本框中将显示产品名称和详细信息。现在窗体中显示来自所有四个表的相关数
据。
图 2:显示产品名称和订单明细的窗体
在列表框中选择另一个订单。RTF 文本框中的订单明细将被更新。
关闭窗体。
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交