DataRow内の列の値に変更を加えると、変更はすぐに行の現在の状態になります。 DataRowStateは Modified に設定され、AcceptChanges の RejectChanges メソッドまたは メソッドを使用して変更が受け入れられるか拒否されます。 DataRow には、編集中に行の状態を中断するために使用できる 3 つのメソッドも用意されています。 これらのメソッドは、 BeginEdit、 EndEdit、および CancelEditです。
DataRow 内の列値を直接変更する場合、DataRow は現在、既定、および元の行バージョンを使用して列の値を管理します。 これらの行のバージョンに加えて、BeginEdit、EndEdit、および CancelEdit メソッドでは、4 行目のバージョン (Proposed) が使用されます。 行のバージョンの詳細については、「行の 状態と行のバージョン」を参照してください。
提案された行バージョンは、BeginEdit を呼び出して開始し、EndEdit または CancelEdit を使用するか、AcceptChanges または RejectChanges を呼び出して終了する編集操作中に存在します。
編集操作中に、DataTable の ColumnChanged イベントで ProposedValue を評価することで、個々の列に検証ロジックを適用できます。 ColumnChanged イベントは、変更される列と ProposedValue への参照を保持する DataColumnChangeEventArgs を保持します。 提案された値を評価した後、値を変更するか、編集を取り消すことができます。 編集が終了すると、行は 提案された 状態から移動します。
編集を確認するには 、EndEdit を呼び出すか、CancelEdit を呼び出して 編集を取り消すことができます。 EndEdit は編集内容を確認しますが、AcceptChanges が呼び出されるまで、DataSet は実際には変更を受け入れないことに注意してください。 また、EndEdit または CancelEdit で編集を終了する前に AcceptChanges を呼び出すと、編集が終了し、現在の行バージョンと元の行バージョンの両方で提案された行の値が受け入れられることに注意してください。 同様に、 RejectChanges を 呼び出すと編集が終了し、 現在 の行バージョンと 提案された 行バージョンが破棄されます。 AcceptChanges または RejectChanges を呼び出した後に EndEdit または CancelEditを呼び出しても、編集は既に終了しているため、効果はありません。
次の例では、BeginEdit を EndEdit および CancelEdit と共に使用する方法を示します。 この例では、ColumnChanged イベントの ProposedValue も確認し、編集を取り消すかどうかを決定します。
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();
}
}