Nabend.
Ich versuche, in einem an ein DataSet gebundenem DataGridView (Custom Control), Drag&Drop von Rows zu realisieren.
Leider will es mir nicht gelingen.
Das ganze soll wenn möglich so gestalltet sein, daß nacher am DataGridView nicht mer rumeditiert werden muss,
es soll also alles innerhalb des Controls von statten gehen.
Gut währe es auch, wenn ich über eine Property, eine DataTable angeben könnte.
Die Update Methode sieht jetzt so aus:
Ganze Drag&Drop Routine
Bin ich total auf dem Holzweg ?
Ich versuche, in einem an ein DataSet gebundenem DataGridView (Custom Control), Drag&Drop von Rows zu realisieren.
Leider will es mir nicht gelingen.
Das ganze soll wenn möglich so gestalltet sein, daß nacher am DataGridView nicht mer rumeditiert werden muss,
es soll also alles innerhalb des Controls von statten gehen.
Gut währe es auch, wenn ich über eine Property, eine DataTable angeben könnte.
Die Update Methode sieht jetzt so aus:
VB.NET-Quellcode
- Private Sub Update(ByVal _removeAt As Integer, ByVal _dropIndex As Integer)
- 'Bis jetzt am vielversprechensten (Keine Fehlermeldung), allerdings gehen die daten verloren. :(
- Dim dataTable As DataTable = DirectCast(DirectCast(DataSource, BindingSource).DataSource, DataSet).Tables().Item(0)
- With dataTable
- Dim tempDataRow As DataRow = .Rows(_removeAt)
- .Rows(_removeAt).Delete()
- .Rows.InsertAt(tempDataRow, _dropIndex)
- End With
- ' Währe ja zu schöhn gewesen. :)
- 'DirectCast(DataSource, BindingSource).RemoveAt(_removeAt)
- 'DirectCast(DataSource, BindingSource).Insert(_dragIndex, _dataBoundItem)
- End Sub
VB.NET-Quellcode
- Partial Class DataGridViewDragAndDrop
- Private Sub Me_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
- ButtonPressed = e.Button = MouseButtons.Right
- End Sub
- Private Sub Me_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
- If Not DragAndDrop OrElse AllRowsSelected Then Exit Sub
- If ButtonPressed Then
- If MouseDownLocation = Point.Empty Then
- MouseDownLocation = e.Location
- Exit Sub
- End If
- End If
- If ButtonPressed AndAlso MouseDownLocation <> Point.Empty Then
- Dim hitTestInfo As HitTestInfo = HitTest(e.X, e.Y)
- If hitTestInfo IsNot Nothing AndAlso
- Rows(hitTestInfo.RowIndex).Selected Then
- DragIndex = hitTestInfo.RowIndex
- If Rows(DragIndex).IsNewRow Then Exit Sub
- If MultiSelect Then
- DoDragDrop(SelectedRows, DragDropEffects.Move)
- Else
- DoDragDrop(Rows(DragIndex), DragDropEffects.Move)
- End If
- End If
- End If
- End Sub
- Private Sub Me_DragOver(sender As Object, e As DragEventArgs) Handles Me.DragOver
- e.Effect = DragDropEffects.Move
- End Sub
- Private Sub Me_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
- If ButtonPressed AndAlso e.Button = MouseButtons.Right Then
- ButtonPressed = False
- End If
- End Sub
- Private Sub Me_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
- Dim clientPoint As Point = PointToClient(New Point(e.X, e.Y))
- Dim dropIndex As Integer = HitTest(clientPoint.X, clientPoint.Y).RowIndex
- If e.Effect = DragDropEffects.Move Then
- If MultiSelect Then
- Dim dragRows As DataGridViewSelectedRowCollection =
- DirectCast(e.Data.GetData(GetType(DataGridViewSelectedRowCollection)), DataGridViewSelectedRowCollection)
- For i As Integer = dragRows.Count - 1 To 0 Step -1
- Dim dragRow As DataGridViewRow = dragRows(i)
- Update(dragRow.Index, dropIndex)
- Rows(dropIndex).Selected = True
- Next
- Rows(DragIndex).Selected = False
- Else
- Dim dropRow As DataGridViewRow = DirectCast(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)
- Update(dropRow.Index, dropIndex)
- Rows(dropIndex).Selected = True
- End If
- ButtonPressed = False
- MouseDownLocation = Point.Empty
- End If
- End Sub
- Private Sub Update(ByVal _removeAt As Integer, ByVal _dropIndex As Integer)
- 'Bis jetzt am vielversprechensten (Keine Fehlermeldung), allerdings gehen die daten verloren. :(
- Dim dataTable As DataTable = DirectCast(DirectCast(DataSource, BindingSource).DataSource, DataSet).Tables().Item(0)
- With dataTable
- Dim tempDataRow As DataRow = .Rows(_removeAt)
- .Rows(_removeAt).Delete()
- .Rows.InsertAt(tempDataRow, _dropIndex)
- End With
- ' Währe ja zu schöhn gewesen. :)
- 'DirectCast(DataSource, BindingSource).RemoveAt(_removeAt)
- 'DirectCast(DataSource, BindingSource).Insert(_dragIndex, _dataBoundItem)
- End Sub
- End Class
Bin ich total auf dem Holzweg ?
bit.ly/DotNetSearch
Code Konverter:
Online: @ developerfusion.com, @ telerik.com
Offline stand alone: Convert .NET, C# to VB Converter
VS Extensions: Convert .NET (Based on .NET 4.5), Language Convert
Code Konverter:
Online: @ developerfusion.com, @ telerik.com
Offline stand alone: Convert .NET, C# to VB Converter
VS Extensions: Convert .NET (Based on .NET 4.5), Language Convert