VBiB/ACCB.net
VB.net 2008 - Datagridview move row with drag and drop
boment - 17 sep 2009 - 20:53
Onderwerp: Datagridview move row with drag and drop
Wie kan me op weg helpen met een datagrid view, waarbij ik een row van plaats kan veranderen met drag en drop.
Dus regel "verwijderen" en ergens anders tussen plaatsen.
ik heb al van alles gevonden op internet het laatste was met buttons "Top, Up, Down en Bottom" vind ik niet zo gebruiks vriendelijk ik zou het mooier vinden met drag en drop.
Alvast bedankt,
Svekke - 18 sep 2009 - 09:18
Onderwerp: Re: Datagridview move row with drag and drop
Hier misschien eens kijken?
http://www.codeplex.com/dragdropgrid
boment - 19 sep 2009 - 12:21
Onderwerp: Re: Datagridview move row with drag and drop
Ik heb daar gekeken en de dll gedownload.
In eerste instanstie werkt het best goed, maar voor mijn doel zit er waarschijnlijk een bug in.
Ik pas het toe in 1 datgridview, voor het verplaatsen van regels.
Ik heb gekozen bij de instellingen optie voor "move" dit moet inhouden , de regel verplaatsen dus cut en insert(paste).
Het is merkwaardig dat van boven uit, dus "top down" het prachtig werkt, maar van onder "botom up" werkt het niet , hij laat de "bron" regel staan en kopieerd over de "doel" regel, wat inhoud dat men twee dezelfde regels overhoud . op de oude plaats en op de nieuwe plaats. en er is een regel verdwenen.
Ik heb de broncode van deze dll ook , ik zal deze eens bestuderen waar dit fout gaat.
Svekke - 19 sep 2009 - 18:24
Onderwerp: Re: Datagridview move row with drag and drop
Ja heb het zelf niet getest, maar was het wel tegengekomen.
Mja je bent een echte programmeur he
Dus zal het wel geen probleem zijn om de fout te vinden.
boment - 20 sep 2009 - 07:53
Onderwerp: Re: Datagridview move row with drag and drop
Ik plaats toch even de broncode, misschien is er iemand die de fout ziet.
Het zou kunnen wezen dat het ontwikkeld is in VB2002 en ik gebruik het in 2008.
het zal waarschijnlijk fout gaan met de regelnumering setting.
Iemand ???
Visual Basic code:
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Namespace Controls
Public Class DragDropGrid
Inherits DataGridView
Public Sub New()
dt = Nothing
End Sub
Private dragBoxFromMouseDown As Rectangle
Private isDragging As Boolean = False
Private ds As New DataSet
Private bs As New BindingSource
Public dt As New DataTable
Public rowIndexFromMouseDown As Int32 = 0
Public rowIndexOfItemUnderMouseToDrop As Int32 = 0
#Region "CustomProperties"
Private _AllowReorder As Boolean = False
Private _AllowDrag As Boolean = False
Private _DragType As enumDragType
Public Property AllowDrag() As Boolean
Get
Return _AllowDrag
End Get
Set(ByVal value As Boolean)
_AllowDrag = value
End Set
End Property
Public Property AllowReorder() As Boolean
Get
Return _AllowReorder
End Get
Set(ByVal value As Boolean)
_AllowReorder = value
End Set
End Property
Public Enum enumDragType
Move
Copy
End Enum
Public Property DragType() As enumDragType
Get
Return _DragType
End Get
Set(ByVal value As enumDragType)
_DragType = value
End Set
End Property
#End Region
#Region "EventOverrides"
Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
If AllowDrag Then
rowIndexFromMouseDown = Me.HitTest(e.X, e.Y).RowIndex
If (Not rowIndexFromMouseDown = -1) Then
Dim dragSize As Size = SystemInformation.DragSize
dragBoxFromMouseDown = New Rectangle(New Point(CType(e.X - (dragSize.Width / 2), Int32), _
CType(e.Y - (dragSize.Height / 2), Int32)), dragSize)
Else
dragBoxFromMouseDown = Rectangle.Empty
End If
End If
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
If Not dragBoxFromMouseDown = Rectangle.Empty And _
Not dragBoxFromMouseDown.Contains(e.X, e.Y) Then
Dim dropEffect As DragDropEffects = Me.DoDragDrop( _
Me.Rows(Me.rowIndexFromMouseDown), _
DragDropEffects.Move)
Me.isDragging = True
End If
End If
MyBase.OnMouseMove(e)
End Sub
Protected Overrides Sub OnDataBindingComplete(ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs)
Try
If Me.DataSource.GetType Is GetType(BindingSource) Then
bs = CType(Me.DataSource, BindingSource)
ds = CType(Me.bs.DataSource, DataSet)
dt = ds.Tables(0)
ElseIf Me.DataSource.GetType Is GetType(DataSet) Then
ds = CType(Me.DataSource, DataSet)
dt = ds.Tables(0)
Else
dt = Nothing
End If
Catch ex As Exception
End Try
MyBase.OnDataBindingComplete(e)
End Sub
Protected Overrides Sub OnDragDrop(ByVal e As System.Windows.Forms.DragEventArgs)
Dim clientPoint As Point = Me.PointToClient(New Point(e.X, e.Y))
Me.rowIndexOfItemUnderMouseToDrop = _
Me.HitTest(clientPoint.X, clientPoint.Y).RowIndex
If e.Effect = DragDropEffects.Move Then
Try
Dim rowToMove As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)
Dim dragInitiator As DragDropGrid = CType(rowToMove.DataGridView, DragDropGrid)
Me.rowIndexFromMouseDown = dragInitiator.rowIndexFromMouseDown
If dt Is Nothing Then
If dragInitiator.DragType = enumDragType.Move Then
dragInitiator.Rows.RemoveAt(rowIndexFromMouseDown)
Else
Dim rowClone As DataGridViewRow
rowClone = CType(rowToMove.Clone(), DataGridViewRow)
For i As Integer = 0 To rowClone.Cells.Count - 1
rowClone.Cells(i).Value = rowToMove.Cells(i).Value
Next
rowToMove = rowClone
End If
If Me.rowIndexOfItemUnderMouseToDrop > -1 Then
Me.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove)
Else : Me.Rows.Add(rowToMove)
End If
Else
Dim rowArray As Object() = dragInitiator.dt.Rows(rowIndexFromMouseDown).ItemArray
Dim row As DataRow = Me.dt.NewRow()
row.ItemArray = rowArray
If Me.rowIndexOfItemUnderMouseToDrop > -1 Then
Me.dt.Rows.InsertAt(row, rowIndexOfItemUnderMouseToDrop)
Else : dt.Rows.Add(row)
End If
If dragInitiator.DragType = enumDragType.Move Then dragInitiator.dt.Rows.RemoveAt(rowIndexFromMouseDown)
End If
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End If
Me.isDragging = False
MyBase.OnDragDrop(e)
End Sub
Protected Overrides Sub OnDragOver(ByVal e As System.Windows.Forms.DragEventArgs)
Dim rowToMove As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)
Dim gridInitiator As DragDropGrid = CType(rowToMove.DataGridView, DragDropGrid)
Dim clientPoint As Point = Me.PointToClient(New Point(e.X, e.Y))
Me.rowIndexOfItemUnderMouseToDrop = _
Me.HitTest(clientPoint.X, clientPoint.Y).RowIndex
Dim row As DataGridViewRow
For Each row In Me.Rows
row.Selected = False
Next
If (Me.rowIndexOfItemUnderMouseToDrop > -1) Then Me.Rows(Me.rowIndexOfItemUnderMouseToDrop).Selected = True
If (AllowReorder) Then
e.Effect = DragDropEffects.Move
ElseIf gridInitiator Is Me Then
e.Effect = DragDropEffects.None
Else
e.Effect = DragDropEffects.Move
End If
MyBase.OnDragOver(e)
End Sub
#End Region
End Class
End Namespace
boment - 22 sep 2009 - 09:38
Onderwerp: Re: Datagridview move row with drag and drop
Voor de geintresseerde,
Het werkt alleen zonder koppelin naar database, dus geen DataSource binding, waarom ? ik kan het niet vinden.
Maar zodra je datagridview gevuld wordt d.m.v. Rows.Add werkt alles perfect.
Het is aan te bevelen om de class in je applicatie te plaatsen inplaats van de dll.
suk6, Ben
Yannou - 22 sep 2009 - 09:48
Onderwerp: Re: Datagridview move row with drag and drop
boment schreef:
Het werkt alleen zonder koppelin naar database, dus geen DataSource binding, waarom ? ik kan het niet vinden.
Ik vermoed dat bij een koppeling naar de database, de gegevens up to date gehouden worden door ze regelmatig opnieuw te laden. Hiermee gaat je aangepast volgorde dan verloren.
Groetjes
Tijden zijn in GMT + 1 uur
PNphpBB2 © 2003-2007