(NET) NET (2013)

DragAndDrop DataGridView Rows


In this case I mark only one column as draggable, definition of this column there is in line 11. Another column I use for other operation by handle of click.


   8:  Public Enum nColumn
   9:      FF = 0
  10:      Color = 1
  11:      DragAndDrop = 2
  12:      URL = 3
  13:      Login = 4
  14:      Comment = 5
  15:      Edit = 6
  16:      Del = 7
  17:  End Enum
  ...   
  28:  Public Class MainForm
  ...   
  33:      Public Shared Rows As List(Of Site)
  ...   
  35:      Public Shared RowType As List(Of String)
  36:   
  37:      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  38:          DataGridView1.AutoGenerateColumns = False
  39:          Try
  40:              db1 = New Url_DB(ConnectionString)
  41:              Rows = db1.Sites.Where(Function(X) X.Type = 1).OrderBy(Function(X) X.Pos).ToList
  ...   
  51:      End Sub
  ...   
  ...   
 298:  #Region "DragAndDrop"
 299:      Dim RowIndexFromMouseDown As Integer
 300:      Dim ColumnIndexFromMouseDown As Integer
 301:      Dim DragRow As DataGridViewRow
 302:   
 303:      Private Sub dataGridView1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles DataGridView1.MouseDown
 304:          RowIndexFromMouseDown = DataGridView1.HitTest(e.X, e.Y).RowIndex
 305:          ColumnIndexFromMouseDown = DataGridView1.HitTest(e.X, e.Y).ColumnIndex
 306:          If (RowIndexFromMouseDown <> -1 And ColumnIndexFromMouseDown = nColumn.DragAndDrop) Then
 307:              DataGridView1.Rows(RowIndexFromMouseDown).Selected = True
 308:              DragRow = DataGridView1.SelectedRows(0)
 309:              StatusToolStripLabel.Text = "DragAndDrop Start=" & RowIndexFromMouseDown
 310:              DataGridView1.DoDragDrop(DragRow, DragDropEffects.Move)
 311:          End If
 312:      End Sub
 313:   
 314:      Private Sub DataGridView1_DragEnter(sender As Object, e As DragEventArgs) Handles DataGridView1.DragEnter
 315:          If (DataGridView1.SelectedRows.Count > 0) Then
 316:              e.Effect = DragDropEffects.Move
 317:          End If
 318:      End Sub
 319:   
 320:      Private Sub DataGridView1_DragOver(sender As Object, e As DragEventArgs) Handles DataGridView1.DragOver
 321:          If e.Effect = DragDropEffects.Move Then
 322:              Dim ClientPoint As Point = DataGridView1.PointToClient(New Point(e.X, e.Y))
 323:              RowIndexOfItemUnderMouseToDrop = DataGridView1.HitTest(ClientPoint.X, ClientPoint.Y).RowIndex
 324:              StatusToolStripLabel.Text = "DragAndDrop Continue=" & RowIndexOfItemUnderMouseToDrop
 325:          End If
 326:      End Sub
 327:   
 328:      Private Sub DataGridView1_DragLeave(sender As Object, e As EventArgs) Handles DataGridView1.DragLeave
 329:          StatusToolStripLabel.Text = "DragLeave"
 330:      End Sub
 331:   
 332:      Dim RowIndexOfItemUnderMouseToDrop As Integer
 333:      Private Sub DataGridView1_DragDrop(sender As Object, e As DragEventArgs) Handles DataGridView1.DragDrop
 334:          If e.Effect = DragDropEffects.Move Then
 335:              Dim ClientPoint As Point = DataGridView1.PointToClient(New Point(e.X, e.Y))
 336:              RowIndexOfItemUnderMouseToDrop = DataGridView1.HitTest(ClientPoint.X, ClientPoint.Y).RowIndex
 337:              StatusToolStripLabel.Text = "DragAndDrop Finish, OldPosition=" & RowIndexFromMouseDown & ",NewPosition=" & RowIndexOfItemUnderMouseToDrop
 338:              ReorderRecordInDb(RowIndexFromMouseDown, RowIndexOfItemUnderMouseToDrop)
 339:          End If
 340:      End Sub
 341:   
 342:      Sub ReorderRecordInDb(FromPosition As Integer, ToPosition As Integer)
 343:          If FromPosition <> ToPosition Then
 344:              Dim FromRow As Site = CType(BindingSource1(FromPosition), Site)
 345:              Dim CurDBRecord As Site = Rows.Where(Function(X) X.I = FromRow.I).FirstOrDefault
 346:              Dim ToRow As Site = CType(BindingSource1(ToPosition), Site)
 347:              Dim OldPos As Integer = FromRow.Pos
 348:              Dim NewPos As Integer = ToRow.Pos
 349:              Dim RowsForReorder = db1.Sites.OrderBy(Of Integer)(Function(X) X.Pos).ToList
 350:              For I As Integer = 0 To RowsForReorder.Count - 1
 351:                  If RowsForReorder(I).Pos >= NewPos Then
 352:                      RowsForReorder(I).Pos += 1
 353:                  End If
 354:              Next
 355:              CurDBRecord.Pos = NewPos
 356:              db1.SaveChanges()
 357:              RowsForReorder = db1.Sites.OrderBy(Of Integer)(Function(X) X.Pos).ToList
 358:              For I As Integer = 0 To RowsForReorder.Count - 1
 359:                  RowsForReorder(I).Pos = I + 1
 360:              Next
 361:              db1.SaveChanges()
 362:              DataGridView1_RowFefresh()
 363:          End If
 364:      End Sub
 365:   
 366:  #End Region
  ...   


Comments ( )
Link to this page: //www.vb-net.com/DragAndDropDataGridViewRows/Index.htm
< THANKS ME>