none
Pasar filas de un DataGridView a otro. Ambos enlazados DataTable. Se pierde el RowState. RRS feed

  • 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

    martes, 23 de noviembre de 2010 22:41

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
    miércoles, 24 de noviembre de 2010 3:19

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
    miércoles, 24 de noviembre de 2010 3:19
  • 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.

    miércoles, 24 de noviembre de 2010 13:59