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

Версия

Описание

Current

Строка содержит текущие значения (current values)

Default

Зависит от состояния строки (см. граф после таблицы)

Original

Строка содержит оригинальную версию

Proposed

Строка содержит измененную, но не подтвержденную версию

Динамику изменения версий проще всего описать с помощью графа переходов конечного автомата. Представим, что множество перечисленных в таблице версий — это множество состояний автомата (узлов графа), а множество дуг графа — это те методы класса DataRow, которые переводят автомат из одого состояния в другое. Тогда логику управления версиями можно представить в виде графа, приведенного на рис.?.

Версия по умолчанию (Default-версия) зависит от текущего состояния строки.

·  Для строки в состоянии Added, Modified или Current — это Current-версия.

·  Для строки в состоянии Deleted это — Original-версия.

·  Для строки в состоянии Detached это — Proposed-версия.

Следующий пример демонстрирует работу с версиями строки и перечислением типа DataRowVersion. Добавьте в навигатор кнопку bChange с текстом Change Version и TextBox с именем tPropose. В обработке нажатия кнопки вызовите метод (ChangeVersion (tProposed.Text);), тело которого приведено ниже.

  void ChangeVersion (string s)

  {

   int r = gridStud.CurrentCell.RowIndex;

   DataRowCollection studRows = ds.Tables[0].Rows;

   if (r >= studRows.Count)

   {

    MessageBox.Show("This row is not added to the table");

    return;

   }

   DataRow row = studRows[r];

  //==== BeginEdit тормозит события для того, чтобы без помех внести изменения

  row.BeginEdit ();   // Начинаем изменять значение текущей строки

   row[1] = s;         // Это и есть предлагаемая (proposed) версия

   if (row.HasVersion (DataRowVersion.Proposed)) // Если  proposed version существует

   {

    string

      cur = row[1, DataRowVersion.Current].ToString (),

      prop = row[1, DataRowVersion.Proposed].ToString ();

    MessageBox.Show("Current version = " + cur + "\nProposed version = " + prop);

    if (cur.Equals (prop))

    {

      MessageBox.Show ("The original and the proposed are the same");

      row.CancelEdit ();

      return;

    }

    else

      row.AcceptChanges ();

   }

   else

    MessageBox.Show ("No new values proposed");

  }

}

Для проверки функционирования поставьте фокус на одну из существующих строк:

·  Введите в TextBox какое-либо имя и нажмите кнопку bChange.

·  Повторно нажмите кнопку bChange.

Обратите внимание на использование двухмерного индексатора вида [,], имеющегося в классе DataRow. Именно он позволяет выбрать интересующую версию данных строки таблицы.

Работа со связанными таблицами

Дальнейшее развитие нашего приложения предполагает работу с данными двух связанных таблиц (студентов и их экзаменов). Для отображения данных естественно использовать два компонента DataGridView и синхронизировать их так, как было сделано в предыдущей части курса. Напомню, что там мы отображали не всю таблицу экзаменов, а только выборку из нее (экзамены текущего студента). Текущим, как и ранее, будем считать того студента, строка данных которого активна в первом DataGridView (с идентификатором gridStud).

Если вы хотите развивать приложение, но сохранить существующий код, то лучше поступить так.

·  С помощью Windows Explorer cоздайте копию всей папки решения (solution). Используйте технику Ctrl+Drag.

·  Дайте копии осмысленное имя, например, OleDbOneTable,

·  В папке этой копии уничтожьте файлы StudentsOleDb.sln и StudentsOleDb.suo,

·  Переименуйте папку проекта в OleDbOneTable (папка решения уже переименована).

·  Откройте проект StudentsOleDb.csproj, который расположен внутри папки копии (OleDbOneTable),

·  В окне Solution Explorer над именем проекта нажмите клавишу F2 и перименуйте его в OleDbOneTable, затем нажмите F2 над именем решения и также перименуйте его в OleDbOneTable,