Изменения объекта DataTable
Обновлен: November 2007
При выполнении изменений значений столбцов в DataRow, изменения немедленно помещаются в текущее состояние строки. Затем для DataRowState устанавливается значение Изменено, и изменения принимаются или отвергаются с использованием методов AcceptChanges или RejectChanges объекта DataRow. Объект DataRow предоставляет также три метода, которые можно использовать для приостановки состояния строки, пока пользователь выполняет ее изменение. Такими методами являются: BeginEdit, EndEdit и CancelEdit.
При изменении значений столбцов непосредственно в DataRow объект DataRow управляет значениями столбцов с использованием версий строки Current, Default и Original. В дополнение к этим версиям строки, методы BeginEdit, EndEdit и CancelEdit используют четвертую версию строки: Proposed. Дополнительные сведения о версиях строк см. в разделе Состояния и версии строк.
Версия Proposed строки существует во время операции изменения, которая начинается вызовом BeginEdit, а заканчивается использованием методов EndEdit или CancelEdit, либо вызовом методов AcceptChanges или RejectChanges.
Во время операции изменения к отдельным столбцам можно применить логику проверки, оценив ProposedValue в событии ColumnChanged таблицы DataTable. Событие ColumnChanged содержит DataColumnChangeEventArgs, где хранится ссылка на изменяемый столбец и на ProposedValue. После оценки предложенного значения можно изменить его или отменить изменение. Когда изменение заканчивается, строка выводится из состояния Proposed.
Изменения можно подтвердить, вызвав метод EndEdit, либо можно их отменить, вызвав метод CancelEdit. Следует отметить, что в то время как метод EndEdit подтверждает изменения, метод DataSet фактически не принимает изменения до тех пор, пока не будет вызван метод AcceptChanges. Отметим также, что если метод AcceptChanges вызывается до окончания изменений при помощи EndEdit или CancelEdit, то изменение заканчивается и значения строк Proposed принимаются и для версии Current, и для версии Original строки. Таким же образом вызов метода RejectChanges заканчивает изменения и отменяет версии Current и Proposed строк. Вызов метода EndEdit или CancelEdit после вызова AcceptChanges или RejectChanges не оказывает никакого влияния, т. к. изменение уже закончено.
Следующий пример демонстрирует, как использовать метод BeginEdit с методами EndEdit и CancelEdit. В примере также проверяется ProposedValue в событии ColumnChanged, выполняется решение, отменить ли изменение.
Dim workTable As DataTable = New DataTable
workTable.Columns.Add("LastName", Type.GetType("System.String"))
AddHandler workTable.ColumnChanged, _
New DataColumnChangeEventHandler(AddressOf OnColumnChanged)
Dim workRow As DataRow = workTable.NewRow()
workRow(0) = "Smith"
workTable.Rows.Add(workRow)
workRow.BeginEdit()
' Causes the ColumnChanged event to write a message and cancel the edit.
workRow(0) = ""
workRow.EndEdit()
' Displays "Smith, New".
Console.WriteLine("{0}, {1}", workRow(0), workRow.RowState)
Private Shared Sub OnColumnChanged( _
sender As Object, args As DataColumnChangeEventArgs)
If args.Column.ColumnName = "LastName" Then
If args.ProposedValue.ToString() = "" Then
Console.WriteLine("Last Name cannot be blank. Edit canceled.")
args.Row.CancelEdit()
End If
End If
End Sub
DataTable workTable = new DataTable();
workTable.Columns.Add("LastName", typeof(String));
workTable.ColumnChanged +=
new DataColumnChangeEventHandler(OnColumnChanged);
DataRow workRow = workTable.NewRow();
workRow[0] = "Smith";
workTable.Rows.Add(workRow);
workRow.BeginEdit();
// Causes the ColumnChanged event to write a message and cancel the edit.
workRow[0] = "";
workRow.EndEdit();
// Displays "Smith, New".
Console.WriteLine("{0}, {1}", workRow[0], workRow.RowState);
protected static void OnColumnChanged(
Object sender, DataColumnChangeEventArgs args)
{
if (args.Column.ColumnName == "LastName")
if (args.ProposedValue.ToString() == "")
{
Console.WriteLine("Last Name cannot be blank. Edit canceled.");
args.Row.CancelEdit();
}
}
См. также
Основные понятия
Обработка событий DataTable (ADO.NET)