ADO.NET maintains up to three versions of each DataRow
object. The DataAdapter
reconciles changes made
since the data was loaded from the data source, thereby making
changes to the disconnected data permanent. Two versions of each row
are maintained to allow the DataAdapter
to
determine how to perform the reconciliation. The
Original
version contains the values that were
loaded into the row. The
Current
version contains the latest version of
the data, including the changes made since the data was originally
loaded. The Original
version
isn’t available for newly created rows.
ADO.NET also allows a row to be put into edit mode which temporarily
suspends events for the row and allows the user to make multiple
changes to the row without triggering validation rules. The
BeginEdit( )
method of the
DataRow
puts the row into edit mode, while the
EndEdit( )
and CancelEdit( )
methods take the row out of edit mode.
AcceptChanges( )
also takes the row out of edit
mode because it implicitly calls EndEdit( )
, as
does RejectChanges( )
, which implicitly calls
CancelEdit( )
.
A Proposed
row version is made available while the
row is in edit mode and contains the changes that have been made to
the row while it was in edit mode. If the EndEdit( )
method is called, the changes made are copied from the
Proposed
row to the Current
row. If the CancelEdit( )
method is called, the
values in the Proposed
version are simply
discarded. In either case, once the editing is completed, the
Proposed
version of the row is no longer
available.
Finally, a Default
row version returns the
Current
version if the row isn’t
being edited or the Proposed
row if it is.
The HasVersion( )
method of the DataRow
can determine whether a specific version of the row exists. If the
version exists, column values for it can be retrieved using one of
the three overloads of the DataRow
indexer. The
following example shows how to check for and retrieve the
Proposed
version of a row:
DataRow dr; // ... code to build, fill, and modify the row object objColVal; // check if the Proposed version of the row exists if (dr.HasVersion(DataRowVersion.Proposed)) { // retrieve the value for the first column in the Proposed row objColVal = dr[0, DataRowVersion.Proposed]; }