Chapter: 13.6 Navigating Hierarchical Data

The strongly typed DataSet provides two methods for each DataRelation, TableNameRow( ) and TableNameRows( ), to facilitate navigating records in parent child relationships. These methods are similar to the GetParentRow( ) and GetChildRows( ) methods in the untyped DataSet. The TableNameRow( ) method is defined for the child table and retrieves the parent row for a DataRow. The TableNameRows( ) method is defined for the parent table in a relationship and retrieves the child rows for a DataRow.
The strongly typed DataSet methods encapsulate the DataRelations defined within the DataSet so a reference to the DataRelation or the name of the DataRelation isn't required when navigating the hierarchy of records. The following sample demonstrates using the strongly typed DataSet methods to navigate a hierarchy of records:
// strongly typed DataSet called Northwind containing Orders table and
// OrderDetails table, related through the OrderID field
Northwind ds = new Northwind();
// ... code to fill the Orders and Order Details tables in the DataSet
foreach(Northwind.OrdersRow ordersRow in ds.Orders)
{
// iterate the collection of order details for the order through
// the GetOrderDetailsRow accessor
foreach(Northwind.Order_DetailsRow orderDetailsRow in
ordersRow.GetOrder_DetailsRows())
{
// get the CustomerID from the parent row, through the
// OrdersRow property of the child row
String customerId = orderDetailsRow.OrdersRow.CustomerID;
// get the ProductID
Int32 productId = orderDetailsRow.ProductID;
}
}
This example shows comparable code using an untyped DataSet:
// untyped DataSet containing Orders table and
// OrderDetails table, related through the OrderID field
DataSet ds = new DataSet();
// ... code to define or retrieve the schema for the Orders and
// [Order Details] tables schemas including creating DataRelation objects
// ... code to add new rows to the Orders and [Order Details] tables
foreach(DataRow ordersRow in ds.Tables["Orders"].Rows)
{
foreach(DataRow orderDetailsRow in
ordersRow.GetChildRows("Order_OrderDetails"))
{
// get the CustomerID from the parent row
String customerId =
orderDetailsRow.GetParentRow("Order_OrderDetails")
["CustomerID"].ToString();
// get the ProductID
Int32 productId = (Int32)orderDetailsRow["ProductID"];
}
}







