【问题标题】:Populating a DataGridView on-the-fly (VB.NET)动态填充 DataGridView (VB.NET)
【发布时间】:2011-09-22 20:34:09
【问题描述】:

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

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

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

以前有人做过吗,你是怎么做到的?

干杯。

【问题讨论】:

    标签: vb.net dynamic datagridview scrollbar populate


    【解决方案1】:

    也许您可以减少结果集并使用 > 类型的分页控件。 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);
    }
    

    【讨论】:

    • 感谢 Ken - '>' 方式是我们现在正在做的,但客户要求能够使用滚动条滚动。无论如何感谢您的回答。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多