Версия |
Описание |
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,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.