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

32 Replies to “Copiar o mover filas de un DataGridView a otro.”

  1. 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?

  2. 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

  3. 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,

  4. 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

  5. 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

  6. 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,

  7. 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.

  8. 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

  9. 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,

  10. buenas revisando su en la red encontre su blog muy buena explicación y ahora aprovechando la ocasion le hago una pregunta como seria el caso que no quiero copiar datos ente datagridview si no que quiero eliminar datos de un datagridview y que alñ mismo tiempo se eliminen de la bd al marcarlos con el checkbox y apretando un boton??? por si aca estoy trabajando con vb.net 2005 y bd access gracias

  11. PepLluis, yo utilizo un codigo muy similar para importar un txt al datagridview1
    mi duda es como puedo hacer para desglozar en varias columnas sin usar caracter especiales solo por longitud de caracteres, el archivo que importo es una cantidad de filas con numeros muyy larga. Uso VS05.Slds.Thanks.

  12. Hola Jesus,
    Conoces esta expresion?

    Dim Trama As String = “Campo 1,Campo 2,Campo 3”
    Dim Elementos As String() = Trama.Split(“,”)

    Creo que puede solucinarte la duda,
    Pep Lluis,

  13. Respondiendo a Glanorca,

    Deberias usar alguno de los ejemplos que enlazan del DataGrid a la Bd utilizando un binding que hace el ‘update’ cuando se agregan/eliminan registros del mismo.

    Saludos,
    Pep Lluis,

  14. Este codigo me puede servir para aplicarlo en vb6, lo que necesito es algo asi, pero te explico, tengo un formulario con 2 datagrid, los dos estan enlazados a una tabla cada uno las cuales pues son diferentes, ahora la cuestion es que yo quiero elegir de esos dos data grid algun registro y copiarlo ya sea a otro datagrid para despues guardarlos en otra tabla diferente y poder imprimir un informe de esos registros.
    Si fueras tan amable de ayudarme estoy atorada solo con eso y llevo dias buscando y investigando como hacerlo y no encuentro como, si me puedes ayudar con un ejemplo o algo pareceido, te lo agradecere.
    saludos

  15. hola, he leido este codigo y me ha sido de muchisima ayuda, solo que tengo un problemita, tal vez sea algo suupr tonto pro no lo puedo hacer, yo necesito pasar una fila seleccionada de un datagrid a otro como tu lo haces, pero los datadgrid estan en diferentes forms, asi que cuando intento pasar la fila que seleccione no me aparece nadaa!!, ya lo hice con 2 datagrid en la misma form y no hay problema, pero con los grid en diferente form el segundo grid sale vacio, espro k me puedas ayudar a corregir esto, muchisismas gracias 🙂 estoy en vb.net 2008

  16. Hola Ana,
    Deberias usar un ‘Modulo’ Vb o Clase statica C#, para intercambiar el DataRow entre ambos.

    En todo caso puedes contactarme o dirigirte a los foros para detallar un ejemplo concreto.
    Saludos,
    PepLluis,

  17. hola PepLluis, en mi caso es muy pareceido al planteado inicialmente pero el paso de informacion de un gridview a otro es a travez de la validacion de un textbox ya q es un dato capturado ,la finalidad es q una vez capturado lo busque en el GridView1 y lo pase al Gridview2.
    Agradezco muco de tu ayuda ya que nada q ñpgro dar con la solucion.

  18. hola! pepe luis
    es bien sabido o he visto, que es mejor usar list que vectores. en la parte de tu codigo:

    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

    trato de hacer esto con list:

    private List ObtenerValoresFila()
    {
    List Contenido = new List();
    for (int i = 0; i < list.Count; i++) { Contenido.Add[i]=fila.Cells[i].Value.ToString(); } return Contenido; } Me podrias iluminar un poco, conozco poco de c# y de visualBasic conoci el 6 espero tu respuesta Gracias!!

  19. Hola PepLluis, que pones en la parte (Obtenervalores fila, (seleccion)) en esta parte de tu código ya que me aparece que no he declarodo la variable.

    ‘Copiar los elementos seleccionados del DGV1 al DGV2
    Sub CopiarSeleccionadosDGV1aDGV2()
    For Each Seleccion As DataGridViewRow In DgvMenu.SelectedRows
    Me.DgvSalida.Rows.Add(ObtenerValoresFila(Seleccion))
    Next
    DgvMenu.ClearSelection()
    End Sub

    mi correo es memocaceres@gmail.com

  20. Hola Memo,
    Es solo un ejemplo y debe implementarse cubriendo diferentes escenarios… el error es porque debes seleccionar una fila del DGV antes de copiar/mover..etc.
    ObtenerValoresFila(Seleccion) representa el objeto que contiene las filas seleccionadas.

    Espero que esto ayude,
    PepLluis,

  21. Hola a todos como podria mover 2 columnas enteras(las filas de solo esas 2 columnas) de un datagriedview a otro en diferentes form

  22. Hola Pepe ,muy bueno el tutorial! ,estoy tratando de implementarlo con sqlserver 2008,queria saber de la parte de conexion,que lineas no irian del ejemplo? no es posible realizar lo mismo del pasaje de datos entre dos datagridview pero en dos form? es decir que desde un form se llame al 2 form? Gracias.

  23. hola estoy intentando hacer una bd en visual studio 2010 pero
    no domino perfectamente este entorno.
    por esto quiero hacete esta consulta.
    tengo mi base de datos y quiero leer cada registro y duplicar determinados registros cambiando el dato de un campo.
    no se como tengo que hacerlo , quiero que lea busque y cuando lo encuentre lo copie después del ultimo nro de registro copie todos los datos menos uno que yo le indico en código fuente y automáticamente lo copie.
    espero me puedas ayudar gracias

    1. Hola Monica,
      Te aconsejo busques un ejemplo completo que te sirva como punto de entrada en : https://code.msdn.microsoft.com/

      En otro caso, si tienes alguna pregunta especifica sobre como resolver algún detalle concreto estaré encantado de continuar la conversación.
      Gracias por contactarme.
      Un Saludo,

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.