Principales respuestas
Pasar filas de un DataGridView a otro. Ambos enlazados DataTable. Se pierde el RowState.

Pregunta
-
Hola a todos.
Tengo el siguiente escenario:
Un control de usuario que contiene dos DataGridView (dgv), uno a la izquierda (de ahora en adelante dgvOrigen) y otro a la derecha (de ahora en adelante dgvDestino); tengo dos botones en medio de los dos dgv, un botón para pasar las filas seleccionadas en el dgvOriden al dgvDestino, y otro botón para ejecutar la acción contraria.
Ambos dgv están enlazados a un respectivo DataTable (dt): dgvOrigen.DataSource = dtOrigen y dgvDestino.DataSource = dtDestino.
Los dt son cargados desde respectivos procedimientos almacenados.
Este es el código del botón que me permite pasar las filas seleccionadas del dgvDestino al dgvOrigen:
private void btnDerIzq_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow dr in dgvDestino.SelectedRows)
{
DataRowView drv = dr.DataBoundItem as DataRowView;
dtOrigen.Rows.Add(drv.Row.ItemArray);
drv.Row.Delete();
}
}
El código del otro botón (btnIzqDer) es similar.
La situación es que luego de que el usuario hace su tarea de seleccionar filas de un lado a otro y decide guardar, el control de usuario me retorna el dtDestino, que es el que me interesa, para persistirlo en una tabla.
Entonces recorro el dtDestino que me retornó el control en busca de los registros que fueron agregados y en busca de los que fueron eliminados, para poder o bien hacer un INSERT o el respectivo DELETE, según el caso:
foreach (DataRow dr in dtDestino.Rows)
{
switch (dr.RowState)
{
case DataRowState.Added:
DALDestino.Add(dr); //INSERT
break;
case DataRowState.Deleted:
DALDestino.Remove(dr); //DELETE
break;
}
}
Pero la sorpresa que me llevo es que absolutamente todas las filas del dtDestino están en RowEstate: Added, así se conserven algunos de los registros originales.
El problema es que a ciencia cierta no sé cuáles son los elementos nuevos en el dtDestino, y tampoco sé cuáles elementos se removieron.
Entonces les pido comedidamente que me colaboren a identificar qué es lo que ocurre dada la situación que comenté, o si se les ocurre una mejor alternativa para para saber cuáles son los elementos agregados y cuáles los elementos eliminados.
Juan David Rios
Bogotá - Colombia
vampijd@hotmail.com
Respuestas
-
hola
el tema es que estas queriando haceer un merge de la informaxion existente y la nueva que vas a ingresar
no digo que no se peuda pero es tedioso realziar esta operacion
lo mas simple es eliminar los registros actuales de la tabla y volvar la seleccion actual que esta en el control, o sea seria DELETE y luego INSERT solo dos operaciones, o sea un volcado completo de los registros, es lo ams simple para evitar el merge de ambos origenes de datos (los existenes y los actuales)
si estas trabjando con alguna entidad por ejmeplo cliente, borrarias los datos seleccionados a esta entidad cliente, por ejmeplo el cliente 20, DELETE FROM Clientes WHERE Id = 20
y luego insertas los datos del datagridview presentes para este mismo
saludo
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Victoria Rodriguez miércoles, 24 de noviembre de 2010 3:42
- Votado como útil vampijd martes, 30 de noviembre de 2010 14:19
- Marcado como respuesta Eduardo PorteschellerModerator miércoles, 1 de diciembre de 2010 13:59
Todas las respuestas
-
hola
el tema es que estas queriando haceer un merge de la informaxion existente y la nueva que vas a ingresar
no digo que no se peuda pero es tedioso realziar esta operacion
lo mas simple es eliminar los registros actuales de la tabla y volvar la seleccion actual que esta en el control, o sea seria DELETE y luego INSERT solo dos operaciones, o sea un volcado completo de los registros, es lo ams simple para evitar el merge de ambos origenes de datos (los existenes y los actuales)
si estas trabjando con alguna entidad por ejmeplo cliente, borrarias los datos seleccionados a esta entidad cliente, por ejmeplo el cliente 20, DELETE FROM Clientes WHERE Id = 20
y luego insertas los datos del datagridview presentes para este mismo
saludo
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Victoria Rodriguez miércoles, 24 de noviembre de 2010 3:42
- Votado como útil vampijd martes, 30 de noviembre de 2010 14:19
- Marcado como respuesta Eduardo PorteschellerModerator miércoles, 1 de diciembre de 2010 13:59
-
Hola Leandro,
Precisamente no quería recurrir a esa solución. Quería ahorrarme el tener que eliminar todos los registros y luego, como bien dices, hacer el Insert del dt como lo dejó el usuario después de operarlo.
El tema es que en otros formularios tengo DataGridView y utilizo el esquema que comenté en la pregunta, es decir, que el DataTable me informe a través del RowState de cada Row que ocurrió con ese registro y procedo 'elegantemente' a hacer el INSERT, el UPDATE o el DELETE correspondiente según el caso.
Por ahora toca recurrir a la solución más simple, aunque menos 'elegante'.
Muchas gracias Leandro por tu pronta respuesta.