none
como se reflejan los cambios de un DataGridView en su DtaSource (DataTable)? RRS feed

  • Pregunta

  • Hola a todos!

    Mi pregunta es: ¿lo que ocurre en un dataGridView se refleja automáticamente en su dataSource (un dataTable para el caso)? Esto es, si por ejemplo elimino una fila del dataGridView, ¿También se elimina ésta del dataTable?

    Muchas gracias por su amable atención.

    martes, 27 de marzo de 2018 21:54

Respuestas

  • ¿lo que ocurre en un dataGridView se refleja automáticamente en su dataSource (un dataTable para el caso)?

    Sí, los cambios se reflejan sobre el datatable que hay en el datasource, pero no necesariamente resulta evidente la forma en la que se reflejan. El DataTable mantiene dos copias de los registros: el valor original y el valor actual. El original se conserva todo el rato, y el actual es el que refleja lo que hay en el grid. Si, por ejemplo, borras algo en el grid, no se borra la fila original en el datatable sino que se marca como borrada. Si insertas una fila nueva, se añade a las actuales (y se marca como "nueva"), pero no afecta a las originales. Y si modificas una existente, se marca como "cambiada" (y el cambio solo está en las nuevas, no en las originales).

    Si en algún momento quieres deshacer los cambios, puedes llamar a .RevertChanges, y eso copia las originales sobre las actuales, con lo que los cambios "desaparecen" del grid.

    Si usas un DataAdapter para salvar los cambios, el dataadapter examina el estado de las filas y manda a la base de datos un Insert, Update o Delete según el estado de cada fila, y es capaz de hacer cosas tales como "update la tabla set ... campos = valores nuevos... where ...campos = valores antiguos", gracias a las dos copias de los datos.

    Después de grabar, deberías llamar al método .AcceptChanges, y eso copia los valores actuales encima de los originales, de manera que si sigues haciendo cambios y vuelves a grabar, solo se salvan los nuevos cambios ocurridos después del AcceptChanges.

    miércoles, 28 de marzo de 2018 6:55
    Moderador

Todas las respuestas

  • Correcto.  Pero le recomiendo usar colecciones y clases para DataSource en vez de DataTable.

    Jose R. MCP
    Code Samples

    martes, 27 de marzo de 2018 22:22
    Moderador
  • hola

    >>si por ejemplo elimino una fila del dataGridView, ¿También se elimina ésta del dataTable?

    entiendo que no, sino que se marca con el estado, por eso tienes la propiedad

    DataRow.RowState

    veras que puedes usar el DataViewRowState.Deleted con el Select() para obtener las rows marcadas para eliminar

    Row States and Row Versions

    la idea es que quedan marcadas porque si usas un TableAdapter al realizar el Update() aplicara lo delete sobre estas rows ejecutandolo contra la db

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 28 de marzo de 2018 3:04
  • ¿lo que ocurre en un dataGridView se refleja automáticamente en su dataSource (un dataTable para el caso)?

    Sí, los cambios se reflejan sobre el datatable que hay en el datasource, pero no necesariamente resulta evidente la forma en la que se reflejan. El DataTable mantiene dos copias de los registros: el valor original y el valor actual. El original se conserva todo el rato, y el actual es el que refleja lo que hay en el grid. Si, por ejemplo, borras algo en el grid, no se borra la fila original en el datatable sino que se marca como borrada. Si insertas una fila nueva, se añade a las actuales (y se marca como "nueva"), pero no afecta a las originales. Y si modificas una existente, se marca como "cambiada" (y el cambio solo está en las nuevas, no en las originales).

    Si en algún momento quieres deshacer los cambios, puedes llamar a .RevertChanges, y eso copia las originales sobre las actuales, con lo que los cambios "desaparecen" del grid.

    Si usas un DataAdapter para salvar los cambios, el dataadapter examina el estado de las filas y manda a la base de datos un Insert, Update o Delete según el estado de cada fila, y es capaz de hacer cosas tales como "update la tabla set ... campos = valores nuevos... where ...campos = valores antiguos", gracias a las dos copias de los datos.

    Después de grabar, deberías llamar al método .AcceptChanges, y eso copia los valores actuales encima de los originales, de manera que si sigues haciendo cambios y vuelves a grabar, solo se salvan los nuevos cambios ocurridos después del AcceptChanges.

    miércoles, 28 de marzo de 2018 6:55
    Moderador
  • Muchas gracias Alberto, bastante instructiva tu respuesta.
    sábado, 31 de marzo de 2018 15:43
  • Hola Leandro... este, como tus demás aportes siempre me parecen muy útiles. Gracias por tus contribuciones.

    Quisiera saber si me puedes ayudar con un lío que tengo con WPF que parece muy trivial, pero no se resolverlo y no me han podido ayudar. Si no es molestia, este el el hilo, gracias:

    https://social.msdn.microsoft.com/Forums/es-ES/6dd9aead-6cf4-41cd-b41e-6131b9edf02a/validar-presin-tecla-asterisco-?forum=wpfes
     
    lunes, 2 de abril de 2018 16:46