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

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