Навигационные возможности для связанных таблиц

Навигационные возможности для связанных таблиц

Чтобы продемонстрировать возможности 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.