none
No me funciona Drag&Drop en mi Datagridview RRS feed

  • Pregunta

  • Hola amigos del foro: Estuve buscando desde hace rato en este foro cómo hacer Drag & Drop en un datagridview. Encontré un buen ejemplo aqui: http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/a44622c0-74e1-463b-97b9-27b87513747e#faq22. El problema es que cuando bindeo mi datagrid con una tabla, dgv1.DataSource = dtVentas, pues el D&D deja de funcionar. 

    ¿Puede alguien ayudarme?

    Gracias.

    miércoles, 23 de enero de 2013 4:57

Respuestas

  • Public Class Form1
        Private dt As DataTable
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            dt = New DataTable()
    
            dt.Columns.Add("uno")
            dt.Columns.Add("dos")
            dt.Rows.Add("AAA", 0)
            dt.Rows.Add("BBB", 1)
            dt.Rows.Add("CCC", 2)
            dt.Rows.Add("DDD", 3)
            dt.Rows.Add("EEE", 4)
            dt.Rows.Add("FFF", 5)
            dt.Rows.Add("GGG", 6)
    
            DataGridView1.DataSource = dt
            DataGridView1.AllowDrop = True
        End Sub
    
    
        Private Sub DataGridView1_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseMove
            If e.Button <> Windows.Forms.MouseButtons.Left Then Return
    
            Dim dgv As DataGridView = DirectCast(sender, DataGridView)
            Dim ht As DataGridView.HitTestInfo = dgv.HitTest(e.X, e.Y)
    
            If ht.Type <> DataGridViewHitTestType.Cell Then Return
    
            ' se trata de un movimiento interno; el primer argumento prodría ser irrelevante;
            ' lo que a nosotros no sirve es la sucesión de mensajes que despacha durante su ejecución;
            ' pero vamos a otorgarle un significado
            dgv.DoDragDrop(ht.RowIndex.ToString(), DragDropEffects.Move)
    
        End Sub
    
        Private Sub DataGridView1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles DataGridView1.DragEnter
            e.Effect = DragDropEffects.Move
        End Sub
    
        Private Sub DataGridView1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles DataGridView1.DragDrop
    
            Dim dgv As DataGridView = DirectCast(sender, DataGridView)
            Dim ht As DataGridView.HitTestInfo = dgv.HitTest(dgv.PointToClient(Cursor.Position).X, dgv.PointToClient(Cursor.Position).Y)
    
            If ht.Type <> DataGridViewHitTestType.Cell Then Return
    
            Dim i As Integer = e.Data.GetData(Type.GetType("System.String"))
    
            If i = ht.RowIndex Then Return
    
            Dim fila As DataRow = dt.NewRow()
    
            fila(0) = dgv.Rows(i).Cells(0).Value
            fila(1) = dgv.Rows(i).Cells(1).Value
    
            dt.Rows.RemoveAt(i)
            dt.Rows.InsertAt(fila, ht.RowIndex)
    
        End Sub
    End Class
    

    viernes, 1 de febrero de 2013 0:37

Todas las respuestas

  • ¿Nadie puede ayudar con alguna idea?
    miércoles, 23 de enero de 2013 15:20
  • Hace rato ya había formulado esta pregunta y Jose Luis Vargas en este enlace http://social.msdn.microsoft.com/Forums/es/vbes/thread/34ddff8f-84f7-4e68-a900-edc4193a95e2 respondió, lástima que no lo hizo con un ejemplo. ¿Puedo contactarlo de alguna forma para un ejemplo?

    Gracias.

    miércoles, 30 de enero de 2013 18:17
  • El remove/insert se lo practicas a la tabla no a la grilla. ¿No?

    miércoles, 30 de enero de 2013 19:08
  • Así es Walter Miguel, pero no me funciona todo el tiempo.
    miércoles, 30 de enero de 2013 20:23
  • Public Class Form1
        Private dt As DataTable
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            dt = New DataTable()
    
            dt.Columns.Add("uno")
            dt.Columns.Add("dos")
            dt.Rows.Add("AAA", 0)
            dt.Rows.Add("BBB", 1)
            dt.Rows.Add("CCC", 2)
            dt.Rows.Add("DDD", 3)
            dt.Rows.Add("EEE", 4)
            dt.Rows.Add("FFF", 5)
            dt.Rows.Add("GGG", 6)
    
            DataGridView1.DataSource = dt
            DataGridView1.AllowDrop = True
        End Sub
    
    
        Private Sub DataGridView1_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseMove
            If e.Button <> Windows.Forms.MouseButtons.Left Then Return
    
            Dim dgv As DataGridView = DirectCast(sender, DataGridView)
            Dim ht As DataGridView.HitTestInfo = dgv.HitTest(e.X, e.Y)
    
            If ht.Type <> DataGridViewHitTestType.Cell Then Return
    
            ' se trata de un movimiento interno; el primer argumento prodría ser irrelevante;
            ' lo que a nosotros no sirve es la sucesión de mensajes que despacha durante su ejecución;
            ' pero vamos a otorgarle un significado
            dgv.DoDragDrop(ht.RowIndex.ToString(), DragDropEffects.Move)
    
        End Sub
    
        Private Sub DataGridView1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles DataGridView1.DragEnter
            e.Effect = DragDropEffects.Move
        End Sub
    
        Private Sub DataGridView1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles DataGridView1.DragDrop
    
            Dim dgv As DataGridView = DirectCast(sender, DataGridView)
            Dim ht As DataGridView.HitTestInfo = dgv.HitTest(dgv.PointToClient(Cursor.Position).X, dgv.PointToClient(Cursor.Position).Y)
    
            If ht.Type <> DataGridViewHitTestType.Cell Then Return
    
            Dim i As Integer = e.Data.GetData(Type.GetType("System.String"))
    
            If i = ht.RowIndex Then Return
    
            Dim fila As DataRow = dt.NewRow()
    
            fila(0) = dgv.Rows(i).Cells(0).Value
            fila(1) = dgv.Rows(i).Cells(1).Value
    
            dt.Rows.RemoveAt(i)
            dt.Rows.InsertAt(fila, ht.RowIndex)
    
        End Sub
    End Class
    

    viernes, 1 de febrero de 2013 0:37