Украина, Киев |
Объекты DataTable, DataRow и DataColumn
Свойство RowVersion
Свойство RowVersion предназначено для извлечения значения записи (объекта DataRow), зависящего от совершенных изменений. Возможны следующие версии записи:
- Current - текущее значение
- Default - значение по умолчанию
- Original - первоначальное значение
- Proposed - предполагаемое значение
Создайте новое приложение, назовите его "RowVersion". Свойству Size формы устанавливаем значение 500; 300. Из окна Toolbox перетаскиваем следующие элементы и устанавливаем их свойства:
Переходим к коду. В классе формы объявляем объекты 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, Д).
В программном обеспечении к курсу вы найдете приложение RowVersion (Code\Glava4\ RowVersion).
Подобная функциональность вряд может нас устроить в реальных приложениях - в самом деле, мы вставляем только заранее определенное значение "Франция". Скопируйте папку приложения RowVersion и назовите ее RowVersion2. Добавим на форму элементы "надпись" и "текстовое поле":
Для того чтобы эти элементы поместились на панели, последнюю немного растянем, а кнопки сдвинем вниз, к краю формы. Обработчики кнопок изменим следующим образом:
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):
В программном обеспечении к курсу вы найдете приложение RowVersion2 (Code\Glava4\ RowVersion2).