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)