0

我有一个 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 的原因——我在获取新记录之前和之后调用它们,这会暂时禁用滚动条。

这样做的问题,在重新启用滚动条后,它不会跟踪当前的鼠标状态,所以如果你用鼠标按住“向下”按钮(或单击滚动条的一部分)它会停止添加新记录后滚动,您必须再次单击它。

此外,这似乎不是一种特别优雅的做事方式。

以前有没有人这样做过,你是怎么做到的?

干杯。

4

2 回答 2

0

使用virtualDataGridView 的属性怎么样?有关示例,请参阅在 Windows 窗体 DataGridView 控件中使用实时数据加载实现虚拟模式。

于 2011-09-22T12:34:09.227 回答
0

也许您可以减少结果集并使用 << 和 >> 类型的分页控件。Nerd Dinner 演示介绍了一个使用 LINQ 的优雅解决方案:

//
// GET: /Dinners/
//      /Dinners/Page/2

public ActionResult Index(int? page)
{

    const int pageSize = 20;

    var upcomingDinners = dinnerRepository.FindUpcomingDinners();

    var paginatedDinners = upcomingDinners.Skip((page ?? 0) * pageSize)
                                          .Take(pageSize)
                                          .ToList();

    return View(paginatedDinners);
}
于 2009-11-16T15:28:26.790 回答