首页 > 解决方案 > 将数据延迟加载(分页)到 DataGridView

问题描述

我正在寻找一种使用 NHibernate 将数据“延迟”加载到 DataGridView(简称 DGV)中的方法。当我使用 DGV 打开窗口时,我希望它仅加载部分数据(例如 50 条记录),然后,如果用户向下滚动 DGV 并接近末尾(或恰好在最后一行),则应自动加载并插入更多数据进入 DGV。

现在(我刚刚开始研究它)我正在使用这个简单的代码:

dgv.DataSource = session.QueryOver<T>().List();

它加载数据,将其返回IList<T>并设置DataSource为我的 DGV。现在我想按上面描述的块加载这些数据,所以我将使用BindingList<T>as DataSource,然后将更多数据添加到该列表中。

在这一点上,我所需要的只是一种知道何时应该向我的 BindingList 添加更多记录的方法。DGV 是否提供了任何事件,例如NewRowNeeded事件,可以让我实现该功能?还有其他活动可以帮助我完成这项任务吗?

事件的一个明显问题NewRowNeeded是它需要VirtualModeDGV,这反过来又迫使我实现在这种情况下将被禁用的实际“绑定”。由于我不需要以任何方式处理 DGV 中显示的数据(除了告诉:在此列中显示此属性,结束),我认为这不是VirtualMode正确的方式,但实际上我从未尝试过使用这种模式.

标签: datagridviewpagination

解决方案


好的,看来我已经找到了一种方法来进行分页,但仍然保持DataSource绑定可用。它可以使用Scroll每当第一个显示的行的索引发生变化时发生的事件来实现(或类似的东西,我没有检查微软创建的代码中的内容)。在此事件的处理程序中,我可以使用FirstDisplayedScrollingRowIndex属性和DisplayedRowCount方法来检查(计算)最后显示的行的索引。知道索引和已加载行的数量后,我可以决定何时加载更多数据。还需要一个事件处理程序 - Resize. Scroll事件不会在 DGV 调整大小时触发,因为它似乎与第一个可见行的索引相关(如我上面所写),所以如果 DGV 的大小增加(作为控件),那么最后显示的行索引必须是再次检查。

我现在发现的唯一缺点(这还没有实现,只是想一种解决问题的方法)是简单的鼠标滚动会触发此事件三次(可能取决于系统设置),使用侧面的滚动条会触发很多更多,所以我必须找到一种在滚动期间“轻轻”加载数据的方法(保存已经请求的行数,在单独的线程中加载数据)。


推荐阅读