DataGridView Drag'n'Drop扩展功能

时间:2013-10-23 13:46:06

标签: vb.net datagridview

我有一些DataGridView功能,可以将数据从拖动行替换为删除行(几列数据) 但这只是在DGV的可见范围内。

如果我要将数据放在可见区域之后的100行或之前50行的行中,该怎么办? 实际上,我知道如何放弃,因为我继承了我的DGV:

Protected Overrides Sub onDragDrop(ByVal e As DragEventArgs)

    Dim p As Point = Me.PointToClient(New Point(e.X, e.Y))
    dropindex = Me.HitTest(p.X, p.Y).RowIndex
    If (e.Effect = DragDropEffects.Move AndAlso Not cancelDrop) Then
        Dim dragRow As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)
        RaiseEvent Dropped(dragindex + 1, dropindex + 1)
    End If
    cancelDrop = False
    MyBase.OnDragDrop(e)
End Sub

但是这里似乎必不可少的是如何用鼠标左键滚动DGV以便能够放下一些远行,因为MouseWheel和键盘不能按下按钮...

人们如何解决这种情况?

EDIT / SOLUTION: 通过varocarbas的一些提示和建议,我发现这个代码并稍微调整它以满足需要,现在我可以说这项工作还可以。对于那些喜欢漂亮的代码和更好的功能的人来说,可能需要一些“美学编码”。

但对我来说这没关系。 保持所有拖放代码不变,只需将其添加到DragOver处理程序即可。 (在我的情况下,它是在子类中,因为我希望我的所有数据网格都具有这些功能)。

Protected Overrides Sub onDragOver(ByVal e As DragEventArgs)

    e.Effect = DragDropEffects.Move

    Try
        If e.Y <= PointToScreen(New Point(Me.Location.X, Me.Location.Y)).Y + 40 Then
            Me.FirstDisplayedScrollingRowIndex -= 1
        End If
        If e.Y >= PointToScreen(New Point(Me.Location.X + Me.Width, Me.Location.Y + Me.Height)).Y - 10 Then
            Me.FirstDisplayedScrollingRowIndex += 1
        End If
    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try

    MyBase.OnDragOver(e)
End Sub

http://www.codeguru.com/csharp/csharp/cs_controls/datagrid/article.php/c14903/Tip-Auto-Scroll-While-Implementing-Drag--Drop-for-Reordering-Rows-in-DataGridView.htm

好吧,我希望有人发布改进的解决方案,而不是回复我自己的帖子。 我在DGV上测试了75行和.FullRowSelect = True和AllowDrop = True。如果您按下鼠标左键并将其拖动到可见网格的上限或下限(按高度-Y),它将滚动直到您释放按钮或将鼠标指针返回到网格内。 我还在Try / Catch块中放置了一个代码,以避免检查网格的数据边界。

0 个答案:

没有答案