我有一个 DataGridView,它从自定义(CSLA)列表对象中读取数据。数据集可能有 100,000 条记录,显然我不想一次全部显示它们,因为一方面,加载需要很长时间。
我认为如果我可以读取前(例如)20 条记录,并且在滚动到列表末尾时,它会读取接下来的 20 条记录并将它们添加到 DataGridView。
我已经尝试了各种方法来执行此操作,主要是使用从 DataGridView 继承的自定义类来捕获滚动事件并引发添加新记录的事件。我将包括以下代码:
Public Class TestDGV
Inherits DataGridView
Public Sub New()
AddHandler Me.VerticalScrollBar.ValueChanged, AddressOf vsScrollEvent
AddHandler Me.RowsAdded, AddressOf vsRowsAddedEvent
End Sub
Private Sub vsScrollEvent(ByVal sender As Object, _
ByVal e As EventArgs)
With DirectCast(sender, ScrollBar)
If .Value >= (.Maximum - .LargeChange) Then
RaiseEvent ScrollToEnd()
End If
End With
End Sub
Private Sub vsRowsAddedEvent(ByVal sender As Object, ByVal e As EventArgs)
ScrollbarOn()
End Sub
Public Event ScrollToEnd()
Public Sub ScrollbarOff()
Me.VerticalScrollBar.Enabled = False
End Sub
Public Sub ScrollbarOn()
Me.VerticalScrollBar.Enabled = True
End Sub
End Class
虽然这(有点)有效,但它可能是错误的。最大的问题是,如果您使用鼠标滚动 DataGrid,它会在添加数据后处理滚动条的 ValueChanged 事件时陷入循环。这就是我添加 ScrollbarOff 和 ScrollbarOn 的原因——我在获取新记录之前和之后调用它们,这会暂时禁用滚动条。
这样做的问题是,在重新启用滚动条后,它不会跟踪当前的鼠标状态,所以如果你用鼠标按住“向下”按钮(或单击滚动条的一部分)它会停止添加新记录后滚动,您必须再次单击它。
此外,这似乎不是一种特别优雅的做事方式。
以前有没有人这样做过,你是怎么做到的?
干杯。