Principales respuestas
como se reflejan los cambios de un DataGridView en su DtaSource (DataTable)?

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.
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.
- Propuesto como respuesta Willams Morales miércoles, 28 de marzo de 2018 15:13
- Votado como útil Tonatiuh AbregoModerator miércoles, 28 de marzo de 2018 16:37
- Propuesto como respuesta Tonatiuh AbregoModerator miércoles, 28 de marzo de 2018 16:37
- Marcado como respuesta hjarami sábado, 31 de marzo de 2018 15:40
Todas las respuestas
-
Correcto. Pero le recomiendo usar colecciones y clases para DataSource en vez de DataTable.
Jose R. MCP
Code Samples -
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
veras que puedes usar el DataViewRowState.Deleted con el Select() para obtener las rows marcadas para eliminar
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 -
¿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.
- Propuesto como respuesta Willams Morales miércoles, 28 de marzo de 2018 15:13
- Votado como útil Tonatiuh AbregoModerator miércoles, 28 de marzo de 2018 16:37
- Propuesto como respuesta Tonatiuh AbregoModerator miércoles, 28 de marzo de 2018 16:37
- Marcado como respuesta hjarami sábado, 31 de marzo de 2018 15:40
-
-
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
- Editado Andres Altamar lunes, 2 de abril de 2018 16:48