1

我有一些 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 和键盘不适用于按下按钮......

人们如何解决这种情况?

编辑/解决方案:通过 varocarbas 的一些提示和建议,我找到了这段代码并稍微调整它以适应 ma 的需求,现在我可以说这项工作正常。对于那些喜欢漂亮代码和更好功能的人来说,可能需要一点“审美编码”。

但对我来说这没关系。保持所有拖放代码不变,只需将其添加到 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

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

4

0 回答 0