Úpravy datových tabulek

Když provedete změny hodnot sloupců v objektu DataRow, změny se okamžitě umístí do aktuálního stavu řádku. Pak je DataRowState nastavena na Změněno a změny jsou přijaty nebo odmítnuty pomocí AcceptChanges nebo RejectChanges metody třídy DataRow. Poskytuje DataRow také tři metody, které můžete použít k pozastavení stavu řádku při úpravách. Tyto metody jsou BeginEdit, EndEdita CancelEdit.

Když přímo upravujete DataRow hodnoty sloupců, DataRow spravuje hodnoty sloupců pomocí verzí aktuální, výchozí, a Original řádku. Kromě těchto verzí řádků používají BeginEdit, EndEdit a CancelEdit metody čtvrtou verzi řádku: Proposed. Další informace o verzích řádku najdete v části Stavy řádků a verze řádků.

Verze Proposed řádku existuje během operace úprav, která začíná voláním BeginEdit a končí buď pomocí EndEdit , nebo CancelEdit, nebo voláním AcceptChanges nebo RejectChanges.

Během operace úprav můžete použít logiku ověřování u jednotlivých sloupců vyhodnocením ProposedValue v ColumnChanged události DataTable. Událost ColumnChanged uchovává DataColumnChangeEventArgs odkaz na sloupec, který se mění, a na Navrhovanou hodnotu. Po vyhodnocení navrhované hodnoty ji můžete upravit nebo zrušit. Po ukončení úpravy se řádek přesune mimo Proposed stav.

Úpravy můžete potvrdit voláním EndEdit nebo je můžete zrušit voláním CancelEdit. Všimněte si, že i když EndEdit potvrdí provedené úpravy, DataSet změny ve skutečnosti nepřijme, dokud není AcceptChanges zavolán. Všimněte si také, že pokud voláte AcceptChanges před ukončením úpravy pomocí EndEdit nebo CancelEdit, úprava je ukončena a hodnoty řádků Proposed jsou přijaty pro obě verze řádků, tedy jak pro verzi Current, tak pro verzi Original. Stejným způsobem volání RejectChanges ukončí úpravy a zahodí verze řádků označené Current a Proposed. Volání EndEdit nebo CancelEdit po volání AcceptChanges nebo RejectChanges nemá žádný vliv, protože úpravy už skončily.

Následující příklad ukazuje použití BeginEdit s EndEdit a CancelEdit. Příklad také zkontroluje ProposedValue v události ColumnChanged a rozhodne, zda zrušit úpravu.

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();
    }
}

Viz také