Навигационные возможности для связанных таблиц
Навигационные возможности для связанных таблиц
Чтобы продемонстрировать возможности DataRelation при программной реализации доступа к данным связанных таблиц, добавьте в форму новый тип Button и соответствующий ему TextBox. В результате конечный пользователь должен получить возможность ввести идентификационный номер заказчика и увидеть информацию о заказе соответствующего клиента, которая выводится в простом окне сообщения. Обработчик события Click этой кнопки реализован так.
private void btnGetInfo_Click(object sender, System.EventArgs e) {
string strInfo = "";
DataRow drCust = null;
DataRow[] drsOrder = null;
// Получение указанного CustID из TextBox.
int theCust = int.Parse(this.txtCustID.Text);
// Получение для CustID соответствующей строки таблицы Customers.
drCust = carsDS.Tables["Customers"].Row[theCust];
strInfo += "Заказчик №" + drCust["CustID"].ToString() + " ";
// Переход от таблицы заказчиков к таблице заказов.
drsOrder = drCust.GetChildRows(carsDS.Relations["CustomerOrder"]);
// Получение номера заказа.
foreach (DataRow r in drsOrder) strInfo += "Номер заказа: " + r["OrderID"] + " ";
// Переход от таблицы заказов к таблице ассортимента.
DataRow[] drsInv = drsOrder[0].GetParentRows(carsDS.Relatios["InventoryOrder"]);
// Получение информации о машине.
foreach (DataRow r in drsInv) {
strInfo += "Марка: " + r["Make"] + " ";
strInfo += "Цвет: " + r["Color"] + " ";
strInfo += "Название: " + r["PetName"] + " ";
}
MessageBox.Show(stxInfo, "Информация для данного заказчика");
}
Как видите, ключом к решению задачи перемещения между таблицами данных оказывается использование ряда методов, определённых типом DataRow. Давайте разберем этот программный код но порядку. Сначала вы получаете подходящий идентификационный номер заказчика из текстового блока и используете этот номер для того, чтобы найти соответствующую строку в таблице Customers (конечно же, с помощью свойства Rows), как показано ниже.
// Получение указанного CustID из TextBox.
int theCust = int.Parse(this.txtCustID.Text);
// Получение для CustID соответствующей строки таблицы Customers.
DataRow drCust = null;
drCust = carsDS.Tables["Customers"].Raws[theCust];
strInfo += "3аказчик №" + drCust["CustID"].ToString() + " ";
Затем вы переходите от таблицы Customers к таблице Orders, используя отношение CustomerOrder. Обратите внимание на то, что метод DataRow.GetChildRows() позволяет получить доступ к строкам дочерней таблицы. После этого вы можете прочитать информацию из этой таблицы.
// Переход от таблицы заказчиков к таблице заказов.
DataRow[] drsOrder = null;
drsOrder = drCast.GetChildRows(carsDS.Relations["CustomerOrder"]);
// Получение номера заказа.
foreach(DataRow r in drsOrder) strInfo += "Номер заказа: " + r["OrderID"] + " ";
Заключительным шагом является переход от таблицы Orders к родительской таблице (Inventory) с помощью метода GetParentRows(). После этого вы сможете прочитать информацию из таблицы Inventory для столбцов Make, PetName и Color. как показано ниже.
// Переход от таблицы заказов к таблице ассортимента.
DataRow[] drsInv = drsOrder[0].GetParentRows(carsDS.Relations["InventoryOrder"]);
foreach(DataRow r in drsInv) {
strInfo += "Марка: " + r["Make"] + " ";
strInfo += "Цвет: " + r["Color"] + " ";
strInfo += "Название: " + r["PetName"] + " ";
}
На рис. 22.21 показан один из возможных вариантов вывода.
Рис. 22.21. Навигация по связанным данным
Этот пример убеждает в пользе типа DataSet. Поскольку DataSet отсоединяется от соответствующего источника данных, вы можете работать с копией данных, размещенной в памяти, переходя от одной таблицы к другой и выполняя все необходимые модификации, удаления или вставки. По завершении этой работы вы можете направить свои изменения в хранилище данных для их обработки.
Исходный код. Проект MultitabledDataSetApp размещен в подкаталоге, соответствующем главе 22.