Freigeben über


Bearbeiten von Daten in einer Tabelle

Wenn Sie Spaltenwerte in einer DataRow ändern, werden diese Änderungen sofort in den Current-Status der Zeile platziert. Dann wird der RowState auf Modified gesetzt, und die Änderungen werden mit der AcceptChanges-Methode oder der RejectChanges-Methode der DataRow übernommen oder zurückgewiesen. Die DataRow stellt außerdem drei Methoden bereit, mit denen Sie den Status der Zeile, während Sie sie bearbeiten, aussetzen können: BeginEdit, EndEdit und CancelEdit.

Wenn Sie Spaltenwerte direkt in einer DataRow bearbeiten, verwaltet die DataRow die Spaltenwerte mit Hilfe der Zeilenversionen Current, Default und Original. Die BeginEdit-, EndEdit- und CancelEdit-Methode verwenden darüber hinaus eine vierte Zeilenversion: Proposed. Weitere Informationen zu Zeilenversionen finden Sie unter Zeilenstatus und Zeilenversion.

Die Proposed-Zeilenversion ist während einer Bearbeitungsoperation vorhanden, die durch Aufrufen von BeginEdit begonnen und entweder durch EndEdit oder CancelEdit oder durch Aufrufen von AcceptChanges oder RejectChanges beendet wird.

Während der Bearbeitung können Sie Überprüfungslogik auf einzelne Spalten anwenden, indem Sie den ProposedValue im ColumnChanged-Ereignis der DataTable auswerten. Das ColumnChanged-Ereignis speichert DataColumnChangeEventArgs, die einen Verweis auf die sich ändernde Spalte und den ProposedValue enthalten. Nach dem Auswerten des vorgeschlagenen Wertes können Sie diesen entweder ändern oder die Bearbeitung abbrechen. Nach Ende der Bearbeitung verlässt die Zeile den Proposed-Status.

Sie können Bearbeitungen bestätigen, indem Sie EndEdit aufrufen, und abbrechen, indem Sie CancelEdit aufrufen. Beachten Sie Folgendes: Während EndEdit die Bearbeitungen bestätigt, werden die Änderungen vom DataSet tatsächlich erst übernommen, nachdem AcceptChanges aufgerufen wurde. Außerdem wird die Bearbeitung beendet, wenn Sie AcceptChanges aufrufen, bevor Sie die Bearbeitung mit EndEdit oder CancelEdit beendet haben, und die Proposed-Zeilenwerte werden sowohl in die Current-Zeilenversion als auch in die Original-Zeilenversion übernommen. Entsprechend wird durch Aufrufen von RejectChanges die Bearbeitung beendet und die Current- und die Proposed-Zeilenversion verworfen. Das Aufrufen von EndEdit oder CancelEdit nach dem Aufrufen von AcceptChanges oder RejectChanges hat keinerlei Wirkung, da die Bearbeitung bereits beendet wurde.

Das folgende Beispiel veranschaulicht die Verwendung von BeginEdit mit EndEdit und CancelEdit. Dabei wird außerdem der ProposedValue im ColumnChanged-Ereignis überprüft und entschieden, ob die Bearbeitung abgebrochen werden soll.

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
[C#]
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();
    }
}

Siehe auch

Bearbeiten von Daten in einer Datentabelle | Verwenden von DataTable-Ereignissen | DataRow-Klasse | DataTable-Klasse | DataRowVersion-Enumeration