Технология Microsoft ADO.NET

       

Свойство RowVersion


Свойство RowVersion предназначено для извлечения значения записи (объекта DataRow), зависящего от совершенных изменений. Возможны следующие версии записи:

  • Current - текущее значение
  • Default - значение по умолчанию
  • Original - первоначальное значение
  • Proposed - предполагаемое значение

Создайте новое приложение, назовите его "RowVersion". Свойству Size формы устанавливаем значение 500; 300. Из окна Toolbox перетаскиваем следующие элементы и устанавливаем их свойства:

panel1, свойство Значение
Dock Bottom
dataGrid1, свойство Значение
Dock Left
CaptionText Туры
splitter1, свойство Значение
Dock Left
richTextBox1, свойство Значение
Name rtbReport
Dock Fill
Text
button1, свойство Значение
Name BtnBeginEdit
Location 14; 21
Text Begin Edit
button2, свойство Значение
Name btnEndEdit
Location 106; 21
Text End Edit
button3, свойство Значение
Name btnCancelEdit
Location 198; 21
Text Cancel Edit
button4, свойство Значение
Name btnDelete
Location 290; 21
Text Удалить
button5, свойство Значение
Name btnClearReport
Location 382; 21
Size 96; 23
Text Очистить отчет

Переходим к коду. В классе формы объявляем объекты DataRow и DataTable:

DataRow myRow; DataTable dtTours;

В конструкторе формы создаем запись, определяем источник данных для элемента DataGrid, а также отключаем его доступность:

public Form1() { InitializeComponent(); dtTours = new DataTable("Туры"); DataColumn IDtour = new DataColumn("Название", typeof(string)); dtTours.Columns.Add(IDtour); myRow = dtTours.NewRow(); dtTours.Rows.Add(myRow); myRow["Название"] = "Таиланд"; dataGrid1.DataSource = dtTours; dataGrid1.Enabled = false; }

Создаем метод TestRowVersion, в котором будет проверяться свойство RowVersion записи:

private void TestRowVersion() { if(myRow.HasVersion(DataRowVersion.Original)) rtbReport.Text += String.Format("Значение original: {0}\n", myRow["Название", DataRowVersion.Original]); if(myRow.HasVersion(DataRowVersion.Current)) rtbReport.Text += String.Format("Значение current: {0}\n", myRow["Название", DataRowVersion.Current]); if(myRow.HasVersion(DataRowVersion.Default)) rtbReport.Text += String.Format("Значение default: {0}\n", myRow["Название", DataRowVersion.Default]); if(myRow.HasVersion(DataRowVersion.Proposed)) rtbReport.Text += String.Format("Значение proposed: {0}\n", myRow["Название", DataRowVersion.Proposed]); }


Метод HasVersion позволяет определить, поддерживает ли объект myRow версию данных, указываемую в скобках. В случае подтверждения будет выполняться код оператора - выводится в элемент rtbReport соответствующее сообщение.

В обработчике кнопки "Begin Edit" вызываем метод BeginEdit, устанавливаем новое значение записи:

private void btnBeginEdit_Click(object sender, System.EventArgs e) { myRow.BeginEdit(); myRow["Название"] = "Франция"; rtbReport.Text += "BeginEdit\n"; TestRowVersion(); }

В обработчике кнопки "End Edit" завершаем редактирование записи:

private void btnEndEdit_Click(object sender, System.EventArgs e) { myRow.EndEdit(); rtbReport.Text += "EndEdit\n"; TestRowVersion(); }

В обработчике кнопки "Cancel Edit" отказываемся от внесенных изменений:



private void btnCancelEdit_Click(object sender, System.EventArgs e) { myRow.CancelEdit(); rtbReport.Text += "CancelEdit\n"; TestRowVersion(); }

В обработчике кнопки "Удалить" удаляем объект myRow:

private void btnDelete_Click(object sender, System.EventArgs e) { myRow.Delete(); rtbReport.Text += "Запись удалена\n"; TestRowVersion(); }

В обработчике кнопки "Очистить отчет" просто удаляем содержимое текстового поля:

private void btnClearReport_Click(object sender, System.EventArgs e) { this.rtbReport.Text = ""; }

Запускаем приложение. После нажатия кнопки "BeginEdit" мы начинаем редактирование записи, вводится новое значение - "Франция". Оно становится значением по умолчанию "Default" и предполагаемым "Proposed", значение "Таиланд" является текущим "Current" (рис. 8.19, А). Отменяем редактирование, нажимая кнопку "Cancel Edit". При этом значение "Таиланд" становится текущим "Current" и по умолчанию " Default" (рис. 8.19, Б). Снова начинаем редактирование - картина повторяется (рис. 8.19, В). На этот раз завершаем его, нажимая кнопку "End Edit" - новое значение "Франция" становится текущим "Current" и по умолчанию " Default" (рис. 8.19, Г).


Нажимаем кнопку "Удалить" - при этом удаляется сам объект myRow и дальнейшее изменение его з начений оказывается невозможным (рис. 8.19, Д).


увеличить изображение
Рис. 8.19.  Приложение "RowVersion"

В программном обеспечении к курсу вы найдете приложение RowVersion (Code\Glava4\ RowVersion).

Подобная функциональность вряд может нас устроить в реальных приложениях - в самом деле, мы вставляем только заранее определенное значение "Франция". Скопируйте папку приложения RowVersion и назовите ее RowVersion2. Добавим на форму элементы "надпись" и "текстовое поле":

label1, свойство Значение
location 24; 16
Size 72; 24
Text Название
textbox1, свойство Значение
Name txtmyRowName
location 104; 16
Size 344; 20
Text
Для того чтобы эти элементы поместились на панели, последнюю немного растянем, а кнопки сдвинем вниз, к краю формы. Обработчики кнопок изменим следующим образом:

private void btnBeginEdit_Click(object sender, System.EventArgs e) { myRow.BeginEdit(); rtbReport.Text += "BeginEdit\n"; TestRowVersion(); txtmyRowName.Enabled = true; }

private void btnEndEdit_Click(object sender, System.EventArgs e) { myRow["Название"] = txtmyRowName.Text; myRow.EndEdit(); rtbReport.Text += "EndEdit\n"; TestRowVersion(); txtmyRowName.Enabled = false; }

private void btnCancelEdit_Click(object sender, System.EventArgs e) { myRow.CancelEdit(); rtbReport.Text += "CancelEdit\n"; TestRowVersion(); txtmyRowName.Enabled = false; }

Обработчик кнопки "Удалить" изменим так же - теперь будет удаляться текущий экземпляр myRow и тут же создаваться новый:

private void btnDelete_Click(object sender, System.EventArgs e) { myRow.Delete(); rtbReport.Text += "Запись удалена\n"; TestRowVersion(); myRow = dtTours.NewRow(); dtTours.Rows.Add(myRow); }

В конструкторе формы отключим доступность текстового поля:

public Form1() { ... txtmyRowName.Enabled = false; }

Запускаем приложение. Выполняя знакомую последовательность действий, получаем похожий отчет; теперь при удалении записи можно продолжить работу - объект myRow будет воссоздан (рис. 8.20):


Рис. 8.20.  Приложение RowVersion2

В программном обеспечении к курсу вы найдете приложение RowVersion2 (Code\Glava4\ RowVersion2).


Содержание раздела