Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 601

Эндрю Троелсен

 …

}

Конструктор формы выполняет основную работу по созданию членов-переменных для данных и заполнению DataSet. Обратите также внимание на вызов приватной вспомогательной функции ВuildTableRelationship().

public MainForm() {

 InitializeComponent();

 // Создание адаптеров.

 invTableAdapter = new SqlDataAdapter("Select * from Inventory", cn);

 custTableAdapter = new SqlDataAdapter("Select * from Customers", cn);

 ordersTableAdapter = new SqlDataAdapter("Select * from Orders", cn);

 // Автогенерирование команд.

 sqlCBInventory = new SqlCommandBuilder(invTableAdapter);

 sqlCBOrders = new SqlCommandBuilder(ordersTableAdapter);

 sqlCBCustomers = new SqlCommandBuilder(custTableAdapter);

 // Добавление таблиц в DataSet.

 invTableAdapter.Fill(carsDS, " Inventory");

 custTableAdapter.Fill(carsDS, "Customers");

 ordersTableAdapter.Fill(carsDS, "Orders");

 // Создание отношений между таблицами.

 BuildTableRalationship();

 // Привязка к элементам управления.

 dataGridViewInventory.DataSource = carsDS.Tables["Inventory"];

 dataGridViewCustomers.DataSourсе = carsDS.Tables["Customers"];

 dataGridViewOrders.DataSource = carsDS.Tables["Orders"];

}

Вспомогательная функция BuildTableRelationship() делает в точности то, что от нее ожидается. Напомним, что база данных Cars имеет ряд отношений "родитель-потомок", что учитывается в следующем фрагменте программного кода:

private void BuildTableRelationship() {

 // Создание объекта отношения CustomerOrder.

 DataRelation dr = new DataRelation("CustomerOrder", carsDS.Tables["Customers"].Columns["CustID"], carsDS.Tables["Orders"].Columns["CustID"]);

 carsDS.Relations.Add(dr);

 // Создание объекта отношения InventoryOrder.

 dr = new DataRelation("InventoryOrder", carsDS.Tables["Inventory"].Columns["CarID"], carsDS.Tables["Orders"].Columns["CarID"]);

 carsDS.Relations.Add(dr);

}

Теперь, когда объект DataSet заполнен и отсоединен от источника данных, вы можете работать со всеми таблицами локально. Можно вставлять, обновлять или удалять значения любого из трех DataGridView. Как только вы будете готовы отправить измененные данные обратно в хранилище данных для обработки, щелкните на кнопке обновления формы. Программный код соответствующего обработчика события Click должен быть вам понятен.

private void btnOpdate_Cliсk(object sender, EventArgs e) {

 try {

  invTableAdapter.Update(carsDS, "Inventory");

  custTableAdapter.Update(carsDS, "Customers");

  ordersTableAdapter.Update(carsDS, "Orders");

 } catch (Exception ex) {

  MessageBox.Show(ex.Message);

 }

}

После щелчка на кнопке обновления вы обнаружите, что каждая из таблиц в базе данных Cars соответствующим образом изменена.

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

Чтобы продемонстрировать возможности DataRelation при программной реализации доступа к данным связанных таблиц, добавьте в форму новый тип Button и соответствующий ему TextBox. В результате конечный пользователь должен получить возможность ввести идентификационный номер заказчика и увидеть информацию о заказе соответствующего клиента, которая выводится в простом окне сообщения. Обработчик события Click этой кнопки реализован так.