Вы находитесь на странице: 1из 4

Copiar o mover filas de un DataGridView a otro.

Atendiendo a la consulta de Javier..


Hola Pep Lluis, he ledo 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 datagrids : el1er Datagrid : Muestra el resultado de una bsqueda, de este datagrid deben seleccionar 1 o varios registros y debern 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 ms sofisticadas pero como siempre buscando la simplicidad y en pro de la comprensin os muestro el siguiente ejemplo evitando a exprofeso estructuras complejas difciles de seguir. Para poder tener visin 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 deberis situar el ejemplo como un punto de partida, en ningn caso como una solucin concreta y mucho menos pensando en dos DGVs enlazados a datos y con relaciones pues la cosa puede complicarse ligeramente y como os digo no es el propsito 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, tambin he obviado procesar la excepciones para concentrarnos solo en el cdigo que puede interesarnos por lo que no est libre de errores. Para utilizar este cdigo tienes que crear un nuevo proyecto Windows Form Application desde el men de Visual Basic y arrastrar y soltar dos DGVs, dos CheckBox y dos Botones de la ventana de herramientas, a continuacin solo debes copiar y pegar este cdigo substituyendo el generado por el wizard. Tambin debes crear una BD de Access en la carpeta debug conteniendo la tabla de la BD referenciada en la cadena de conexin, para poder leer tanto cdigo comodamente,.me he tomado la libertad de eliminar las firmas de las funciones, por lo que tendris 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 aplicacin 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 conexin 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

Else

MoverSeleccionadosDGV1aDGV2() End If

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(Selecci on)) 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 'Aadir 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 'Aadir los valores obtenidos de la fila seleccionada 'al segundo datagridview Me.MiDataSet.Tables(0).Rows.Add(ObtenerValoresFila(Selecci on)) '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 tamao 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

Вам также может понравиться