2012-08-06 12 views
5

En una aplicación Winforms Tengo que registrar todos los cambios en datagrid (datatable). En otras palabras, quiero obtener todos los cambios, ya que se ha cargado. Para esto quiero usar Datatable.GetChanges(). Sé que con GetChanges() Obtengo una tabla de datos que contiene una copia de todas las filas en el DataSet original que tienen cambios pendientes.GetChanges() ¿O RowState para obtener todos los cambios de una tabla de datos?

Mi pregunta es ahora, si también es posible obtener más información adicional de los cambios. Por ejemplo, quiero saber si un fila ha sido agregado o eliminado o solo ha sido actualizado. Si una fila ha sido actualizada, ¿también quiero saber qué celdas se han actualizado? ¿Hay alguna manera de obtener toda esta información rápidamente o tengo que hacer un comparación profunda fila por fila con el datatable original?

¿O es mejor utilizar RowState para obtener todos los cambios?

Respuesta

2

Cada DataRow en el DataTable resultante tendrá su conjunto de propiedades RowState, que le indica si la fila se agregó, eliminó o actualizó.

No creo que las celdas individuales proporcionen información de actualización, sin embargo, solo se rastrea por filas.

8

Para la comprobación Además fila/deleción RowState

Para cada elemento de la fila (también conocido como la célula) consultar DataRowVersion

 foreach (DataRow dr in dt.Rows) 
     { 
      if (dr.RowState == DataRowState.Modified) 
      { 
       var changedCols = new List<DataColumn>(); 
       foreach (DataColumn dc in dt.Columns) 
       { 
        if (!dr[dc, DataRowVersion.Original].Equals(
         dr[dc, DataRowVersion.Current])) /* skipped Proposed as indicated by a commenter */ 
        { 
         changedCols.Add(dc); 
        } 
       } 
       // now handle the changedCols list 
      } 
     } 
+0

Gracias por su respuesta. Un par de comentarios: 1) Debe usar Equals(), porque "! =" Comparará las referencias de los objetos devueltos (y devolverá falso incluso si los objetos contienen el mismo valor). 2) Tuve que usar DataRowVersion.Current en lugar de DataRowVersion.Proposed, porque DataRowVersion.Proposed lanzó una excepción. – nightcoder

Cuestiones relacionadas