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