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