Copiar o mover filas de un DataGridView a otro.

Atendiendo a la consulta de Javier..

Hola Pep Lluis, he leído varias veces las soluciones que das en los diferentes espacios y foros, y quizá esta pregunta te la hayan hecho ya, pero la verdad ando algo atorado con este problemilla... ahí va :
La idea es tener 2 datagrid’s : el1er Datagrid : Muestra el resultado de una búsqueda, de este datagrid deben seleccionar 1 o varios registros y deberán pasarse al 2do Datagrid : Que debe mostrar los registros seleccionados en el 1er datagrid.Si paso un registro del Datagrid 1 al 2, el registro desaparecerá del 1 y aparecerá en el 2, y viceversa.

____

DgvToDgv

Supongo que existen diversas formas de conseguir lo mismo y sin duda más sofisticadas pero como siempre buscando la simplicidad y en pro de la comprensión os muestro el siguiente ejemplo evitando a exprofeso estructuras complejas difíciles de seguir.

 Para poder tener visión sobre dos maneras distintas de hacerlo, he decido mostrar el primer DGV unido a una estructura de datos y el segundo “clonado” pero sin estar enlazado a ninguna BD, por lo tanto deberéis situar el ejemplo como un punto de partida, en ningún caso como una solución concreta y mucho menos pensando en dos DGV’s enlazados a datos y con relaciones… pues la cosa puede complicarse ligeramente y como os digo no es el propósito ni alcance de este corto.

Tampoco contempla en qué orden y como se ordenan los registros o filas que se copian o mueven de un lado a otro J, también he obviado procesar la excepciones para concentrarnos solo en el código que puede interesarnos… por lo que no está libre de ‘errores’.

Para utilizar este código tienes que crear un nuevo proyecto “Windows Form Application” desde el menú de Visual Basic y arrastrar y soltar dos DGV’s, dos CheckBox y dos Botones de la ventana de herramientas, a continuación solo debes copiar y pegar este código substituyendo el generado por el ‘wizard’. También debes crear una BD de Access en la carpeta ‘debug’ conteniendo la tabla de la BD referenciada en la cadena de conexión, para poder leer tanto código comodamente,.me he tomado la libertad de eliminar las firmas de las funciones, por lo que tendréis de substituir el “(….)” Por el ‘ByVal sender As System.Object, ByVal e As System.EventArgs’ correspondiente en VB2005 o dejarlo simplemente () en VB2008.

Espero que os sea útil,
Saludos!
Pep Lluis,

Imports System.Data.OleDb

Public Class Form1
    '
    'Definir objectos de conexion a base de datos
    Private MiConexion As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=TuBd.mdb;")
    Private MiAdaptador As New OleDbDataAdapter("SELECT * FROM TuTabla", MiConexion)
    Private MiDataSet As New DataSet()
    Private MiEnlazador As New BindingSource

    '
    'tareas en tiempo de carga de la aplicación
    Private Sub Form1_Load(….) Handles MyBase.Load
        'Abrir conexion y llenar el dataset
        MiConexion.Open()
        MiAdaptador.Fill(MiDataSet)
        Dim commandbuilder As New OleDb.OleDbCommandBuilder(Me.MiAdaptador)
        'Asignamos el origen de datos para del DataGridView
        Me.DataGridView1.DataSource = MiDataSet.Tables(0)
        'Cerrar la conexión
        MiConexion.Close()
        'Clonar o...
        'Reproducir la estructura del 1er dataGrid en DataGridView2
        Me.DataGridView2.ColumnCount = Me.DataGridView1.ColumnCount
        For x = 0 As Integer To Me.DataGridView1.ColumnCount – 1
            Me.DataGridView2.Columns(x).Name = Me.DataGridView1.Columns(x).Name
            Me.DataGridView2.Columns(x).HeaderText = Me.DataGridView1.Columns(x).HeaderText
        Next
        Me.CheckBox1.Checked = True     'por defecto al iniciar seleccionamos
        Me.CheckBox2.Checked = False    'Operaciones origen DGV1, destino DGV2
    End Sub
    '
    'Boton Copiar
    Private Sub Btn_Copiar_Click(….) Handles Btn_Copiar.Click
        'determinar la direccion de copiar entre DGV1 y 2
        If CheckBox1.Checked Then

            'Comprobar que existen columnas seleccionadas
            If DataGridView1.SelectedRows.Count > 0 Then
                CopiarSeleccionadosDGV1aDGV2()
            End If
        Else
            If DataGridView2.SelectedRows.Count > 0 Then
                CopiarSeleccionadosDGV2aDGV1()
            End If
        End If
    End Sub
    '
    'Boton Mover
    Private Sub Btn_Mover_Click(….) Handles Btn_Mover.Click
        'determinar la direccion de mover entre DGV1 y 2
        If CheckBox1.Checked Then
            'Comprobar que existen columnas seleccionadas
            If DataGridView1.SelectedRows.Count > 0 Then
                MoverSeleccionadosDGV1aDGV2()
            End If
        Else
            If DataGridView2.SelectedRows.Count > 0 Then
                MoverSeleccionadosDGV2aDGV1()
            End If
        End If
    End Sub
    '
    'Copiar los elementos seleccionados del DGV1 al DGV2
    Sub CopiarSeleccionadosDGV1aDGV2()
        For Each Seleccion As DataGridViewRow In DataGridView1.SelectedRows
            Me.DataGridView2.Rows.Add(ObtenerValoresFila(Seleccion))
        Next
        DataGridView1.ClearSelection()
    End Sub
    '
    'Copiar los elementos seleccionados del DGV1 al DGV2
    Sub CopiarSeleccionadosDGV2aDGV1()
        For Each Seleccion As DataGridViewRow In DataGridView2.SelectedRows
            Me.MiDataSet.Tables(0).Rows.Add(ObtenerValoresFila(Seleccion))
        Next
        DataGridView2.ClearSelection()
    End Sub
    '
    'Mover los elementos seleccionados del DGV1 al DGV2
    Sub MoverSeleccionadosDGV1aDGV2()
        'Para cada fila seleccionada
        For Each Seleccion As DataGridViewRow In DataGridView1.SelectedRows
            'Añadir los valores obtenidos de la fila seleccionada
            'al segundo datagridview
            Me.DataGridView2.Rows.Add(ObtenerValoresFila(Seleccion))
            'eliminar la fila del DataGridView origen
            DataGridView1.Rows.Remove(Seleccion)
        Next
    End Sub
    '
    'Mover los elementos seleccionados del DGV1 al DGV2
    Sub MoverSeleccionadosDGV2aDGV1()
        'Para cada fila seleccionada
        For Each Seleccion As DataGridViewRow In DataGridView2.SelectedRows
            'Añadir los valores obtenidos de la fila seleccionada
            'al segundo datagridview
            Me.MiDataSet.Tables(0).Rows.Add(ObtenerValoresFila(Seleccion))
            'eliminar la fila del DataGridView origen

            DataGridView2.Rows.Remove(Seleccion)
        Next
    End Sub
    '
    'Obtener el contenido de la fila en un string()
    'con el proposito de copiarlo o moverlo
    '
    'Recibe el 'row' y retorna su contenido en un array tipo string
    Function ObtenerValoresFila(ByVal fila As DataGridViewRow) As String()
        'Dimensionar el array al tamaño de columnas del DGV
        Dim Contenido(Me.DataGridView1.ColumnCount - 1) As String
        'Rellenar el contenido con el valor de las celdas de la fila
        For Ndx As Integer = 0 To Contenido.Length – 1
            Contenido(Ndx) = fila.Cells(Ndx).Value
        Next
        Return Contenido
    End Function
    '
    'Seleccionar la direccion en que se efectuara la copia
    Private Sub CheckBox1_CheckedChanged(….) Handles CheckBox1.CheckedChanged
        CheckBox2.Checked = Not CheckBox1.Checked
    End Sub
    Private Sub CheckBox2_CheckedChanged(….) Handles CheckBox2.CheckedChanged
        CheckBox1.Checked = Not CheckBox2.Checked
    End Sub
End
Class

Published Fri, Sep 19 2008 4:54 by peplluis
Filed under:

Comments

# re: Copiar o mover filas de un DataGridView a otro.

Friday, September 19, 2008 8:20 AM by Raul Bencosme

Si es posible te lo agradeceria sobremanera , es que soy medio novato en el area de los datagridview y no se como adaptarlo a mi caso, en caso de que puedas ayudarme como te contacto? para que veas mi estructura y codigo?

# re: Copiar o mover filas de un DataGridView a otro.

Friday, September 19, 2008 8:55 AM by peplluis

Raul,

Puedes contactar cuando gustes usando la opcion [Contact] en [This Blog]

Espero tus noticias,

Pep Lluis,

# re: Copiar o mover filas de un DataGridView a otro.

Friday, September 19, 2008 9:28 AM by Javier MMM

Muchas gracias Pep Lluis, me ha sido de mucha ayuda el código que me enviaste... Hasta pronto  

# re: Copiar o mover filas de un DataGridView a otro.

Wednesday, November 05, 2008 5:16 PM by roy

me podria decir como se declara la variable x porque me salen errores y me sale otro error en

For Ndx As Integer = 0 To Contenido.Length – 1

me dice que el caracter no es valido

# re: Copiar o mover filas de un DataGridView a otro.

Wednesday, November 12, 2008 2:23 AM by peplluis

Ok, Supongo que estas utilizando una version anterior a Visual Studio 2005, Tan solo necesitas añadir Dim x as integer antes de utilizarla y el el caso del For...

Dim Ndx as Integer

For Ndx = 0 to Contenido.Length -1 ...

Saludos,

Pep Lluis,

# re: Copiar o mover filas de un tableadapter a otro.

Wednesday, April 22, 2009 5:56 PM by Florecita

Hola, tengo un problema con los tableadapter`s lo que pasa que no se como moverme entren los registros y copiarlo y enviarlos a otra tabla, les agradeseria mucho que me ayudaran

Gracias xD

# re: Copiar o mover filas de un DataGridView a otro.

Friday, April 24, 2009 4:23 AM by peplluis

Hola Florecita,

Mira a ver si este ejemplo te sirve :

msmvps.com/.../guardar-el-resultado-de-una-vista-en-una-tabla.aspx

En caso contrario puedes contactar conmigo y explicarmelo en detalle.

Pep Lluis,

# re: Copiar o mover filas de un DataGridView a otro.

Thursday, June 04, 2009 5:09 PM by Linkus FI

Modificado para que el dobleclick sea la orden de pasar la fila

Falta la otra parte deonde se hace copia total y cancelacion total, pero es mas que obvia

   public partial class FrmSeleccionarFacturaCxC : FrmBaseRibbon

   {

       private TablasDataContext Tbl = new TablasDataContext();

       //private DataTable DS = new DataTable();

       public FrmSeleccionarFacturaCxC(int reg)

       {

           InitializeComponent();

           //DataGridView DGTemp = new DataGridView();

           var Datos = from D in Tbl.FACTURAs

                       where D.ClienteId == reg

                       select D;

           if (Datos != null)

           {

               Seleccionadas.AutoGenerateColumns = false;

               Facturas.AutoGenerateColumns = false;

               DGTemp.DataSource = Datos;

               //DGTemp.Visible = true;

               DGTemp.SelectAll();

               foreach (DataGridViewColumn A in DGTemp.Columns)

               {

                   Facturas.Columns.Add(A.Name, A.HeaderText);

               }

               MoverSeleccionadosDGV2aDGV1(DGTemp, Facturas, DataGridViewElementStates.Visible);

               Facturas.Columns["CL_FACTURA"].HeaderText = "Factura";

               Facturas.Columns["FecFactura"].HeaderText = "Fecha";

               Facturas.Columns["Ncliente"].HeaderText = "Cliente";

               Facturas.Columns["TotalFact"].HeaderText = "Monto Factura";

               Facturas.Columns["FacturaId"].Visible = false;

               Facturas.Columns["Subtotal"].Visible = false;

               Facturas.Columns["Impuesto"].Visible = false;

               Facturas.Columns["Dcliente"].Visible = false;

               Facturas.Columns["EmpresaId"].Visible = false;

               Facturas.Columns["clienteid"].Visible = false;

               Facturas.Columns["rfccliente"].Visible = false;

               Facturas.Columns["retencion"].Visible = false;

               Facturas.Columns["fecvencfact"].Visible = false;

               Facturas.Columns["CL_CLIENTE"].Visible = false;

               Facturas.Columns["status"].Visible = false;

               Facturas.Columns["anticipo"].Visible = false;

               Facturas.Columns["conletra"].Visible = false;

               Facturas.Columns["comment"].Visible = false;

               Facturas.Columns["usrcre"].Visible = false;

               Facturas.Columns["perfiscal"].Visible = false;

               Facturas.Columns["feccre"].Visible = false;

               Facturas.Columns["fecmod"].Visible = false;

               Facturas.Columns["esttrab"].Visible = false;

               Facturas.Columns["yearfiscal"].Visible = false;

               Facturas.Columns["usrmod"].Visible = false;

               Facturas.Columns["feccancelfact"].Visible = false;

               Facturas.Columns["tipofact"].Visible = false;

               Facturas.Columns["acuse"].Visible = false;

               Facturas.Columns["usrmod"].Visible = false;

               Facturas.Columns["fechaacuse"].Visible = false;

               Facturas.Columns["fechaexportadaaspel"].Visible = false;

               Facturas.Columns["versionnumber"].Visible = false;

               Facturas.Columns["exportadaaspel"].Visible = false;

               Facturas.Columns["certificada"].Visible = false;

               Facturas.Columns["certserie"].Visible = false;

               Facturas.Columns["cadenaoriginal"].Visible = false;

               Facturas.Columns["sellodigital"].Visible = false;

               Facturas.Columns["certificado"].Visible = false;

               foreach (DataGridViewColumn A in Facturas.Columns)

               {

                   Seleccionadas.Columns.Add(A.Name, A.HeaderText);

                   Seleccionadas.Columns[A.Name].Visible = A.Visible;

               }

               Facturas.Visible = true;

           }

           else

           {

               Facturas.Visible = false;

           }

       }

       public List<int> ObtenerLista()

       {

           ShowDialog();

           if (DialogResult == System.Windows.Forms.DialogResult.Yes)

           {

               List<int> Lista = new List<int>();

               if (Facturas.SelectedRows.Count > 0)

               {

                   foreach(DataGridViewRow R in Facturas.SelectedRows)

                   Lista.Add(Convert.ToInt32(R.Cells["FacturaId"].Value));

               }

               if (Lista.Count > 0)

               {

                   return Lista;

               }

               else

               {

                   return null;

               }

           }

           else

           {

               return null;

           }

       }

       private void Cancelar_Click(object sender, EventArgs e)

       {

           DialogResult = System.Windows.Forms.DialogResult.Cancel;

       }

       private void Aceptar_Click(object sender, EventArgs e)

       {

           DialogResult = System.Windows.Forms.DialogResult.Yes;

       }

       private void SeleccionarCeldas(object sender, DataGridViewCellEventArgs e)

       {

           MoverSeleccionadosDGV2aDGV1(Facturas, Seleccionadas, DataGridViewElementStates.Selected);

       }

       private void CancelarCeldas(object sender, DataGridViewCellEventArgs e)

       {

           MoverSeleccionadosDGV2aDGV1(Seleccionadas, Facturas, DataGridViewElementStates.Selected);

       }

       private void MoverSeleccionadosDGV2aDGV1(DataGridView Origen, DataGridView Destino, DataGridViewElementStates ES)

       {

           if (ES == DataGridViewElementStates.Selected)

           {

               foreach (DataGridViewRow Seleccion in Origen.SelectedRows)

               {

                   ObtenerValoresFila(Seleccion, Destino, ES);

                   Origen.Rows.Remove(Seleccion);

               }

           }

           else if (ES != DataGridViewElementStates.Selected)

           {

               foreach (DataGridViewRow Seleccion in Origen.Rows)

               {

                   ObtenerValoresFila(Seleccion, Destino, ES);

                   Origen.Rows.Remove(Seleccion);

               }

           }

       }

       private void ObtenerValoresFila(DataGridViewRow registro, DataGridView Destino, DataGridViewElementStates ES)

       {

           string[] Contenido = new string[registro.Cells.Count - 1];

           Destino.Rows.Add();

           for(int Ndx=0; Ndx <= Contenido.Length; Ndx++)

           {

               if(registro.Cells[Ndx].Value != null)

               {

                   //Contenido[Ndx] = registro.Cells[Ndx].Value.ToString();

                   Destino.Rows[Destino.Rows.GetLastRow(DataGridViewElementStates.None)].Cells[Ndx].Value = registro.Cells[Ndx].Value.ToString();

               }

           }

       }

   }

}

# re: Copiar o mover filas de un DataGridView a otro.

Tuesday, June 23, 2009 10:41 AM by Victor

Gracias, excelente!

# re: Copiar o mover filas de un DataGridView a otro.

Monday, August 31, 2009 2:34 PM by Alfonso

Que tal muy buen codigo pero me podrias ayudar necesito esta misma opcion pero en C# no se si me podrias ayudar por que ya intente usando la logica de este ejemplo pero no me funciona gracias

# re: Copiar o mover filas de un DataGridView a otro.

Tuesday, September 01, 2009 8:56 AM by peplluis

Hola Alfonso,

Acabo de llegar de vacaciones y en estos momentos no ando demasiado bien de tiempo. Te propongo hacerlo al rebes... contacta conmigo a traves de la opcion [Contact] y una vez en conversacion me envias el codigo que has conseguido y yo termino de ajustarlo para que funcione igual que el ejemplo.

Espero tus noticias,

Saludos,

Pep Lluis,

# re: Copiar o mover filas de un DataGridView a otro.

Wednesday, September 02, 2009 10:38 AM by Vovintherion

Saludos.

gracias por tu aporte  me fue muy util. si estan enlazando datos del Datagridview les producira un error en momento de ejecucion por lo anterior.

pueden agregar las filas a una datatable que es el datasource del datagrid.

# operaciones con gridview vb 9

Wednesday, September 23, 2009 11:59 AM by leopoldo silva

Que tal PepLuis , me gustaria que me auxiliaras con unos problemas que tengo al intentar hacer operaciones entre columnas con un gridview , mi correo es pololeon10 de hotmail , te agradezco la ayuda de antemano , desde chihuahua, mexico

# re: Copiar o mover filas de un DataGridView a otro.

Wednesday, September 23, 2009 12:26 PM by peplluis

Hola Sr. Silva,

Le agradecere que utilice la opcion de [Contact] al inicio de esta pagina. De esa forma podremos mantener una conversacion agil.

Esperando sus noticias, reciba un cordial Saludo,

Pep Lluis,

Leave a Comment

(required) 
(required) 
(optional)
(required)