En una Aplicación de Windows (Visual Studio)(VB) ¿cómo se puede arrastrar y soltar una sola fila a otra posición para permitir al usuario cambiar el orden de la fila? No he encontrado ninguna dignos ejemplos de esto todavía.

OriginalEl autor Troy Mitchel | 2012-07-19

5 Comentarios

  1. 6

    Aquí es una versión de vb a partir de este C# respuesta: ¿Cómo podría Arrastrar y Soltar DataGridView Filas, uno debajo de otro?

    El formulario de variables de clase:

    Private fromIndex As Integer
    Private dragIndex As Integer
    Private dragRect As Rectangle

    El arrastre de eventos:

    Private Sub DataGridView1_DragDrop(ByVal sender As Object, _
                                       ByVal e As DragEventArgs) _
                                       Handles DataGridView1.DragDrop
      Dim p As Point = DataGridView1.PointToClient(New Point(e.X, e.Y))
      dragIndex = DataGridView1.HitTest(p.X, p.Y).RowIndex
      If (e.Effect = DragDropEffects.Move) Then
        Dim dragRow As DataGridViewRow = e.Data.GetData(GetType(DataGridViewRow))
        DataGridView1.Rows.RemoveAt(fromIndex)
        DataGridView1.Rows.Insert(dragIndex, dragRow)
      End If
    End Sub
    
    Private Sub DataGridView1_DragOver(ByVal sender As Object, _
                                       ByVal e As DragEventArgs) _
                                       Handles DataGridView1.DragOver
      e.Effect = DragDropEffects.Move
    End Sub

    Los eventos de ratón:

    Private Sub DataGridView1_MouseDown(ByVal sender As Object, _
                                        ByVal e As MouseEventArgs) _
                                        Handles DataGridView1.MouseDown
      fromIndex = DataGridView1.HitTest(e.X, e.Y).RowIndex
      If fromIndex > -1 Then
        Dim dragSize As Size = SystemInformation.DragSize
        dragRect = New Rectangle(New Point(e.X - (dragSize.Width / 2), _
                                           e.Y - (dragSize.Height / 2)), _
                                 dragSize)
      Else
        dragRect = Rectangle.Empty
      End If
    End Sub
    
    Private Sub DataGridView1_MouseMove(ByVal sender As Object, _
                                        ByVal e As MouseEventArgs) _
                                        Handles DataGridView1.MouseMove
      If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
        If (dragRect <> Rectangle.Empty _
        AndAlso Not dragRect.Contains(e.X, e.Y)) Then
          DataGridView1.DoDragDrop(DataGridView1.Rows(fromIndex), _
                                   DragDropEffects.Move)
        End If
      End If
    End Sub

    Asegúrese de que usted tiene las rejillas AllowDrop de la propiedad se establece en true.

    Alguien puede responder por qué obtengo estos errores cuando se arrastra una fila en cualquier lugar en el Datagridview? Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.
    Como el error dice, la cuadrícula está enlazado a datos (tiene un origen de datos), lo cual significa que usted no puede manipular la rejilla directamente. En su caso, usted necesita para manipular los datos de la fuente en su lugar. Si usted tiene problemas, publicar una nueva pregunta, y el documento adecuado.
    ¿cómo puedo manipular el origen de datos en lugar? este es mi código para el llenado del datagridview: con = New SqlConnection con.ConnectionString = "Data Source=mssql;Initial Catalog=DATABASE;User ID=sa;Password=" con.Open() adap = New SqlDataAdapter("SELECT * FROM tablename", con) ds = New System.Data.DataSet() adap.Fill(ds, "TableNew") Datagridview1.DataSource = ds.Tables(0) con.Close()
    Su tabla de datos: ds.Tables(0). Si agrega una fila a la tabla de datos de la cuadrícula mostrará automáticamente.

    OriginalEl autor LarsTech

  2. 2

    ACTUALIZACIÓN:

    Lugar de

     If dragIndex < 0 Then dragIndex = DataGridView1.RowCount - 1

    cambio

     If dragIndex > -1 Then 
          'action if not selected in the row header and blank space
     else
          'return error if selected in the column header and blank space
     end if

    a continuación, un error se produce cuando se arrastra una fila a la «zona en blanco», si no me cree, usted debe probarlo.

    el código final (Sólo para la parte de «El arrastre de los acontecimientos») es este:

      Private Sub DataGridView1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragDrop
            Dim p As Point = DataGridView1.PointToClient(New Point(e.X, e.Y))
            dragIndex = DataGridView1.HitTest(p.X, p.Y).RowIndex
        'Determine if dragindex is valid row index       
        If dragIndex > -1 Then
            If (e.Effect = DragDropEffects.Move) Then
                Dim dragRow As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)
                DataGridView1.Rows.RemoveAt(fromIndex)
                DataGridView1.Rows.Insert(dragIndex, dragRow)
                'Add this line of code if you want to put selected rows to the rows that change
                DataGridView1.Rows(dragIndex).Selected = True
            End If 
           Else 'Do any message here if selected in column header and blank space. 
           End If
        End Sub

    OriginalEl autor Adrian LG

  3. 1

    Aquí un Control sin el mencionado error.

    Conjunto AllowUserToOrderRows y AllowDrop a True en el Diseñador de Windows Forms y arrastre los encabezados de fila, no el contenido.

    Imports System.ComponentModel
    Public Class BetterDataGridView
    Inherits DataGridView
    <Category("Behavior"), DefaultValue(False)>
    Public Property AllowUserToOrderRows As Boolean = False
    Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
    MyBase.OnMouseDown(e)
    Dim hitInfo As HitTestInfo = HitTest(e.X, e.Y)
    If AllowUserToOrderRows AndAlso
    e.Button = MouseButtons.Left AndAlso
    hitInfo.ColumnIndex = -1 AndAlso
    ValidRow(hitInfo.RowIndex) Then
    DoDragDrop(Rows(hitInfo.RowIndex), DragDropEffects.Move)
    End If
    End Sub
    Protected Overrides Sub OnDragOver(e As DragEventArgs)
    MyBase.OnDragOver(e)
    Dim dragRow As DataGridViewRow = e.Data.GetData(GetType(DataGridViewRow))
    Dim targetIndex As Integer = GetRowIndex(e)
    e.Effect = If(ValidRowDragDrop(dragRow, targetIndex),
    DragDropEffects.Move,
    DragDropEffects.None)
    End Sub
    Protected Overrides Sub OnDragDrop(e As DragEventArgs)
    MyBase.OnDragDrop(e)
    Dim dragRow As DataGridViewRow = e.Data.GetData(GetType(DataGridViewRow))
    Dim targetIndex As Integer = GetRowIndex(e)
    If e.Effect = DragDropEffects.Move AndAlso ValidRowDragDrop(dragRow, targetIndex) Then
    EndEdit()
    Rows.Remove(dragRow)
    Rows.Insert(targetIndex, dragRow)
    ClearSelection()
    dragRow.Selected = True
    End If
    End Sub
    Protected Function ValidRow(rowIndex As Integer) As Boolean
    Return rowIndex >= 0 AndAlso
    rowIndex < Rows.Count - If(AllowUserToAddRows, 1, 0)
    End Function
    Protected Function GetRowIndex(e As DragEventArgs) As Integer
    Dim clientPos As Point = PointToClient(New Point(e.X, e.Y))
    Return HitTest(clientPos.X, clientPos.Y).RowIndex
    End Function
    Protected Function ValidRowDragDrop(dragRow As DataGridViewRow, targetIndex As Integer) As Boolean
    Return dragRow IsNot Nothing AndAlso
    ValidRow(targetIndex) AndAlso
    targetIndex <> dragRow.Index AndAlso
    Rows.Contains(dragRow)
    End Function
    End Class
    Nota: el control sólo aparece en el cuadro de herramientas después de que usted ha construido el proyecto.
    También he descubierto que si me ampliar algunos de los controles de formularios windows forms a continuación, el nuevo código tiene que ser compilado como de 32 bits en orden de trabajo (y por lo tanto sólo puede ser visto en la caja de herramientas una vez compilado correctamente como de 32 bits). Consulte stackoverflow.com/a/26539992/1624894 para obtener más detalles.

    OriginalEl autor John

  4. 0

    Gracias por todo, el código de trabajo. Yo estaba solo error. Lo resuelto.

    si el datagridview «Habilitar Edición» está establecido, recibirá un error al lanzar el interlineado. Usted puede intentar. He resuelto de la siguiente manera:

        Private Sub DataGridView1(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragDrop
    Dim p As Point = DataGridView1.PointToClient(New Point(e.X, e.Y))
    dragIndex = DataGridView1.HitTest(p.X, p.Y).RowIndex
    If (e.Effect = DragDropEffects.Move) Then
    Dim dragRow As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)
    If dragIndex = DataGridView1.RowCount - 1 Then '**ADD THIS AREA**
    DataGridView1.Rows.RemoveAt(fromIndex)
    DataGridView1.Rows.Insert(DataGridView1.RowCount - 1, dragRow)
    Else
    If dragIndex < 0 Then dragIndex = DataGridView1.RowCount - 2 '**this is important**
    DataGridView1.Rows.RemoveAt(fromIndex)
    DataGridView1.Rows.Insert(dragIndex, dragRow)
    End If
    End If
    End Sub

    Gracias por toda la información de otro

    OriginalEl autor Yucel Solmaz

  5. 0

    1.5 mejoras para el evento GridView.DragDrop:

    1. El primer 50% de mejora, Para evitar la describe de error también puede utilizar

      Private Sub DgvSearchFieldCurrent_DragDrop( _
      ByVal sender As  Object, ByVal e As DragEventArgs) _
      Handles DgvSearchFieldCurrent.DragDrop
      Dim LclDgv As DataGridView = CType(sender, DataGridView)
      If dragIndex > -1 AndAlso dragIndex < LclDgv.RowCount -1 Then
    2. Segundo es establecer el foco a la fila actual y la primera celda:

      LclDgv.Rows.Insert(dragIndex, dragRow)
      LclDgv.Rows(fromIndex).Selected = False
      LclDgv.Rows(dragIndex).Selected = True
      For Each C As DataGridViewColumn In LclDgv.Columns
      LclDgv(C.Index, fromIndex).Selected = False
      Next
      LclDgv(0, dragIndex).Selected = True

    OriginalEl autor Tzwenni

Dejar respuesta

Please enter your comment!
Please enter your name here