|
|
| Auteur |
Bericht |
boment
|
|
Onderwerp: Datagridview move row with drag and drop
Geplaatst: 17 sep 2009 - 20:53
|
|
In de startblokken

Geregistreerd op: 10-feb-2009
Berichten: 38
Status: Offline
|
|
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
|
|
Onderwerp: Re: Datagridview move row with drag and drop
Geplaatst: 18 sep 2009 - 09:18
|
|
Op dreef
Geregistreerd op: 01-mei-2007
Berichten: 169
Woonplaats: Herselt
Status: Offline
|
|
|
|
|
 |
boment
|
|
Onderwerp: Re: Datagridview move row with drag and drop
Geplaatst: 19 sep 2009 - 12:21
|
|
In de startblokken

Geregistreerd op: 10-feb-2009
Berichten: 38
Status: Offline
|
|
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
|
|
Onderwerp: Re: Datagridview move row with drag and drop
Geplaatst: 19 sep 2009 - 18:24
|
|
Op dreef
Geregistreerd op: 01-mei-2007
Berichten: 169
Woonplaats: Herselt
Status: Offline
|
|
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
|
|
Onderwerp: Re: Datagridview move row with drag and drop
Geplaatst: 20 sep 2009 - 07:53
|
|
In de startblokken

Geregistreerd op: 10-feb-2009
Berichten: 38
Status: Offline
|
|
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
|
|
Onderwerp: Re: Datagridview move row with drag and drop
Geplaatst: 22 sep 2009 - 09:38
|
|
In de startblokken

Geregistreerd op: 10-feb-2009
Berichten: 38
Status: Offline
|
|
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
|
|
Onderwerp: Re: Datagridview move row with drag and drop
Geplaatst: 22 sep 2009 - 09:48
|
|
Moderator

Geregistreerd op: 14-mrt-2006
Berichten: 2422
Woonplaats: Kraainem
Status: Offline
|
|
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 |
|
|
| |
|
|
|
 |
|
|
|
|