ADO.NET. Управление базами данных. Связь по схеме OLE DB провайдера. Коррекция стилей DataGridView, страница 47

Просмотрите список команд контекстного меню, а также список свойств этого дизайнера. В Visual Studio 2008 он приобрел новое, важное свойство Hierarchical Update. Найдите его в окне свойств и убедитесь, что оно установлено в True. Если установить его в False, то класс TableAdapterManager будет удален из множества сгенерированных классов. Класс TableAdapterManager нам очень нужен, так как именно он управляет процессом обновления таблиц с иерархической структурой.

Просмотрите код метода UpdateAll класса TableAdapterManager. До него можно быстро добраться с помощью диаграммы классов. Убедитесь, что обновление табличных данных производятся в порядке, учитывающем связь между таблицами студентов и экзаменов. Она имеет вид 1-оо (один ко многим), а алгоритм обновления напоминает тот, что был использован нами ранее.

·  Поставьте фокус на линию связи между таблицами и нажмите правую кнопку мыши (или совершите двойной щелчок). Это действие открывает диалог Relation. Убедитесь. что по умолчанию флаг Choose what to create установлен в положение Relation only. Такая установка не соответствует структуре таблиц и нашему желанию вносить изменения в БД. Установите флажок и другие элементы управления так, как показано на рисунке ниже.

 

·  Удалите из класса MainForm объявления переменных и большую часть методов, оставьте лишь минимум кода, как показано ниже.

public partial class MainForm : Form

{

  public MainForm()

  {

   InitializeComponent();

  }

  void MainForm_Load(object sender, EventArgs e)

  {

   try

   {

    ConnectAndRead();

   }

   catch (Exception ex)

   {

    MessageBox.Show(ex.Message, Text);

    Application.Exit();

    return;

   }

  }

  void ConnectAndRead(){ }

  void SerializeBinary()

  {

   Stream stream = new FileStream(@"..\..\Data\Students.stud", FileMode.Create);

   IFormatter fmt = new BinaryFormatter();

//    fmt.Serialize(stream, ds);

   stream.Close();

  }

  void SerializeSoap()

  {

   Stream stream = new FileStream(@"..\..\Data\Students.soap", FileMode.Create);

   IFormatter fmt = new SoapFormatter();

//    fmt.Serialize(stream, ds);

   stream.Close();

  }

  void bn_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

  {

   switch (e.ClickedItem.Text)

   {

    case "&Save": UpdateDB(); break;

    case "Cancel Changes": CancelChanges(); break;

//    case "Save XML": ds.WriteXml(@"..\..\Data\Students.xml", XmlWriteMode.WriteSchema); break;

    case "Serialize Binary": SerializeBinary(); break;

    case "Serialize SOAP": SerializeSoap(); break;

   }

  }

  void CancelChanges() { }

  void UpdateDB()

  {

   try{}

   catch (Exception ex)

   {

    MessageBox.Show(ex.Message);

   }

  }

}

·  Перейдите в режим дизайна формы (Shift+F7) и принесите на нее компонент DataSet. При этом запустится диалог Add DataSet.

·  В окне диалога оставьте выбранный по умолчанию флаг Typed dataset, а из выпадающего списка Name выберите строку Referenced Datasets. Текст строки списка изменится и укажет на типизированный DataSet.

·  Нажмите кнопку OK и в окне свойств, в строке Name, присвойте объекту StudentsDataSet имя ds.

Так как настоящий проект является копией одного из предыдущих, то на форме уже присутствуют два компонента DataGridView: gridStud и gridExam. В данный момент они не привязаны ни к каким источникам данных, так как мы удалили весь код метода ConnectAndRead. Покажем, как осуществить привязку к данным таблиц типизированного DataSet в режиме дизайна.

·  Откройте диалог DataGridView Tasks, нажав кнопку в правом верхнем углу компонента gridStud (небольшой маркер, называемый умной кнопкой — Smart Button).

·  Откройте выпадающий список Choose Data Source и отыщите в дереве Other Data Sources таблицу Studs. Выбор этой таблицы в качестве источника данных создает новый синхронизатор studsBindingSource. На рисунке ниже показано дерево выбора источника данных при повторном открытии диалога, поэтому вы видите, что объект studsBindingSource уже существует.