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