Compartir a través de


Editar DataTable

Actualización: November 2007

Cuando se cambian los valores de las columnas en una DataRow, los cambios se sitúan inmediatamente en el estado actual de la fila. A continuación, el DataRowState se establece en Modified y los cambios se aceptan o se rechazan mediante los métodos AcceptChanges o RejectChanges de la DataRow. DataRow proporciona también tres métodos que se pueden usar para suspender el estado de la fila mientras se está editando. Estos métodos son BeginEdit, EndEdit y CancelEdit.

Cuando se modifican los valores de columna de una DataRow directamente, DataRow administra los valores de columna mediante las versiones de fila Current, Default y Original. Además de estas versiones de fila, los métodos BeginEdit, EndEdit y CancelEdit utilizan una cuarta versión de fila: Proposed. Para obtener más información sobre versiones de fila, vea Estados de fila y versiones de fila.

La versión de fila Proposed propuesta existe mientras dura una operacion de edición que se inicia llamando a BeginEdit y finaliza mediante EndEdit o CancelEdit, o bien llamando a AcceptChanges o RejectChanges.

Durante la operación de edición se puede aplicar la lógica de validación a las columnas individualmente evaluando el ProposedValue del evento ColumnChanged de la DataTable. El evento ColumnChanged contiene DataColumnChangeEventArgs que guardan una referencia a la columna que se está cambiando y al ProposedValue. Después de evaluar el valor propuesto, se puede modificar o cancelar la edición. Cuando termina la operación de edición, la fila abandona el estado de Proposed.

Las modificaciones se pueden confirmar llamando a EndEdit o cancelar llamando a CancelEdit. Tenga en cuenta que aunque EndEdit confirma las modificaciones, DataSet no las acepta realmente hasta que se llama a AcceptChanges. También hay que tener en cuenta que si se llama a AcceptChanges antes de finalizar la operación de edición con EndEdit o CancelEdit, dicha edición finaliza y los valores de fila Proposed se aceptan en las dos versiones de fila: Current y Original. De la misma manera, si se llama a RejectChanges, se finaliza la edición y se descartan las versiones de fila Current y Proposed. Una llamada a EndEdit o CancelEdit después de llamar a AcceptChanges o RejectChanges no tiene ningún efecto porque la edición ya ha finalizado.

En el ejemplo siguiente se muestra cómo se utilizan BeginEdit con EndEdit y CancelEdit. En el ejemplo también se comprueba el ProposedValue del evento ColumnChanged y se decide si cancelar la edición.

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

Vea también

Conceptos

Control de eventos DataTable (ADO.NET)

Referencia

DataRow

DataTable

DataRowVersion

Otros recursos

Manipular datos en DataTable