viernes, 20 de abril de 2012

Drag And Drop entre GridControl´s de DevExpress



Drag and Drop entre GridControl´s de DevExpress

Objetivo: Arrastrar los DataRows de un GridControl(Origen) al GridControl(Destino) en la tabla detalle, ya que su estructura es Maestro-Detalle.

Insertamos dos controles GridControl al formulario

Diseñando el GridDestino:






Creamos un nivel al Gridcontrol principal el cual lo llamamos Detalle












Diseñando el GridOrigen:

El GridOrigen debe tener la misma estructura que el GridView(detalle) del Grid destino


Agregando codigo para cargar de información los GRIDS

Agregamos el siguiente código en el Load del form para construir el DataSource de los Grids y llenarlos de información.




 Dim ds As New DataSet()



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Creamos un dataset y le agregamos tablas
        With ds.Tables
            .Add("maestro")
            .Add("detalles")
        End With

        'Cramos las columnas de las tablas
        With ds.Tables("maestro").Columns
            .Add("idMaestro")
            .Add("descripcionMaestro")
        End With

        With ds.Tables("detalles").Columns
            .Add("idDetalle")
            .Add("descripcionDetalle")
            .Add("idMaestro")
        End With

        'Agregamos la relacion entre las tablas donde el nombre debe coincidir con el nombre del DataView detalle
        ds.Relations.Add("Detalle", ds.Tables("maestro").Columns("idMaestro"), ds.Tables("detalles").Columns("idMaestro"))

        'Agregamos registros a las tablas
        With ds.Tables("maestro").Rows
            .Add("1", "Registro 1")
            .Add("2", "Registro 2")
            .Add("3", "Registro 3")
            .Add("4", "Registro 4")
            .Add("5", "Registro 5")
        End With

        With ds.Tables("detalles").Rows
            .Add("1", "detalle 1", "1")
            .Add("2", "detalle 2", "1")
            .Add("3", "detalle 3", "2")
            .Add("4", "detalle 4", "3")
            .Add("5", "detalle 5", "3")
            .Add("6", "detalle 6", "3")
        End With

        'Enlazamos el GridControlM al DataSet
        GridControlM.DataSource = ds
        GridControlM.DataMember = "maestro"


        'Cargamos mas detalles al Grid origen, que son lo que vamos a arrastrar al GridControlM(Destino)
        Dim tablaOrigen As New DataTable
        With tablaOrigen.Columns
            .Add("idDetalle")
            .Add("descripcionDetalle")
        End With


        With tablaOrigen.Rows
            .Add("1", "detalle 1")
            .Add("2", "detalle 2")
            .Add("3", "detalle 3")
            .Add("4", "detalle 4")
            .Add("5", "detalle 5")
            .Add("6", "detalle 6")

            .Add("7", "Otro detalle 7")
            .Add("8", "Otro detalle 8")
            .Add("9", "Otro detalle 9")
            .Add("10", "Otro detalle 10")
            .Add("11", "Otro detalle 11")
            .Add("12", "Otro detalle 12")
            .Add("13", "Otro detalle 13")

        End With

        GridControlO.DataSource = tablaOrigen
    End Sub

En tiempo diseño establecemos la propiedad AllowDrop de los dos Grids a TRUE

Importamos los siguientes namespaces

Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraGrid.Views.Grid.ViewInfo
Imports DevExpress.XtraGrid

Ejecutamos el Form..y el primera instancia debe quedar de la siguiente manera:






Ahora viene lo bueno………………


Entramos al diseñador del Gridcontrol Origen, seleccionamos el GridView principal y generamos dos eventos haciendo doble clic sobre ellos, tal como se muestra en la imagen





Generamos el evento DragDrop y el DragOver del Gridcontrol Destino

Insertamos el siguiente código en el evento correspondiente

    Dim downHitInfo As GridHitInfo = Nothing
   

    Private Sub GridView2_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles GridView2.MouseMove
        Dim view As GridView = sender
        If e.Button = MouseButtons.Left And downHitInfo IsNot Nothing Then
            Dim dragSize As Size = SystemInformation.DragSize
            Dim dragRect As New Rectangle(New Point(downHitInfo.HitPoint.X - dragSize.Width / 2, downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize)
            If Not dragRect.Contains(New Point(e.X, e.Y)) Then
                Dim row As DataRow = view.GetDataRow(downHitInfo.RowHandle)
                view.GridControl.DoDragDrop(row, DragDropEffects.Move)
                downHitInfo = Nothing
                DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = True
            End If
        End If
    End Sub

    Private Sub GridView2_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles GridView2.MouseDown
        Dim view As GridView = sender
        downHitInfo = Nothing
        Dim hitInfo As GridHitInfo = view.CalcHitInfo(New Point(e.X, e.Y))
        If Control.ModifierKeys <> Keys.None Then Exit Sub
        If e.Button = MouseButtons.Left And hitInfo.RowHandle >= 0 Then
            downHitInfo = hitInfo
        End If
    End Sub

Private Sub GridControlM_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles GridControlM.DragDrop
        'Identificamos el DataRow del origen
        Dim row As DataRow = e.Data.GetData("System.Data.DataRow", True)

        '// Identificamos el DataRow destino
        Dim grid As GridControl = sender

        'El gridview corresponde al que este elmazado con gridcontrol en mi caso es GridView1

        Dim hitInfo As GridHitInfo = GridView1.CalcHitInfo(grid.PointToClient(New Point(e.X, e.Y)))
        Dim targetRow As Integer = hitInfo.RowHandle
        Dim r As DataRow = GridView1.GetDataRow(targetRow)


        'Lo insertamos en el table detalle y refrecamos el GRID


        'Verificar si la asignacion ya existe
        If ds.Tables("detalles").Select("idDetalle='" & row("idDetalle") & "' and idMaestro='" & r("idMaestro") & "'").Length > 0 Then
            MessageBox.Show("¡La relación ya existe!.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If

        'Insertamos el registro en el DataSource
        ds.Tables("detalles").Rows.Add(row("idDetalle"), row("descripcionDetalle"), r("idMaestro"))

        'Refrecamos el DataSource
        GridControlM.RefreshDataSource()

        '/*Ejecutar transacciones correspondientes sobre la base de datos*/

    End Sub

    Private Sub GridControlM_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles GridControlM.DragOver
        ' /*Generación de efecto arrastre*/
        If e.Data.GetDataPresent("System.Data.DataRow", False) Then
            e.Effect = DragDropEffects.Move
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub



¿Pero como eliminamos un registro que haya arrastrado de manera equivocada?


Generamos el evento MouseUp del GridView detalle del GridControl destino, tal como se muestra en la imagen.





Insertamos el siguiente código

Dim rowDelete As DataRow
Private Sub GridView3_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles GridView3.MouseUp
        Dim view As GridView = sender
        rowDelete = view.GetDataRow(view.GetSelectedRows()(0))
    End Sub


Ahora insertaremos un ContrextMenuStrip y lo asignaremos al GridControl Destino, para realizar la eliminación del registro




Insertamos el siguiente código, uno en el evento...y el otro en el boton eliminar...

  Private Sub GridView3_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles GridView3.MouseUp
        Dim view As GridView = sender
        rowDelete = view.GetDataRow(view.GetSelectedRows()(0))
    End Sub
   
    Private Sub EliminarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EliminarToolStripMenuItem.Click
        Try             
            ' Eliminamos el DataRow del DataSource del Grid
            ds.Tables("detalles").Rows.Remove(rowDelete)
            GridControlM.RefreshDataSource() '*Refrecamos

        Catch ex As Exception
            'No hay registros por eliminar
        End Try
    End Sub


Ahora ya pueden arrastrar registros de un Grid a otro…
asi mismo eliminarlos si es que se equivocaron…

El proceso de eliminación o inserción sobre alguna tabla de la base de datos queda de ustedes…………………

Saludos……

Deja tus comentarios……………



miércoles, 4 de abril de 2012

Ajustar columnas de un GridView al contenido de los camps desde código.

  gridView1.OptionsBehavior.AutoPopulateColumns = true; //'generar automaticamente las columnas a raíz del dataset             gridVie...