将数据延迟加载(分页)到DataGridView中

时间:2018-07-13 08:46:55

标签: datagridview pagination

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

现在(我刚刚开始研究它)我正在使用以下简单代码:

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

它将加载数据,将其返回为IList<T>,然后将其设置为我的DGV的DataSource。现在,我如上所述要按块加载此数据,因此我将使用BindingList<T>作为DataSource,然后将更多数据添加到该列表中。

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

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

1 个答案:

答案 0 :(得分:0)

好吧,看来我已经找到了进行分页的方法,但仍然使DataSource绑定可用。可以使用Scroll事件来实现,该事件在显示的第一行的索引发生更改时发生(或者类似的事情,我没有检查Microsoft创建的代码内部是什么)。在此事件的处理程序中,我可以使用FirstDisplayedScrollingRowIndex属性和DisplayedRowCount方法检查(计算)最后显示的行的索引。了解了索引和已经加载的行数后,我可以决定何时加载更多数据。还需要一个事件处理程序-ResizeScroll事件不会在DGV调整大小时触发,因为它似乎与第一个可见行的索引相关(如我上面所述),所以如果DGV的大小增加(作为控件),则最后显示行索引必须再次检查。

我现在发现的唯一弊端(尚未实现,只是想办法解决问题)是简单的鼠标滚动会使用侧面的滚动条触发该事件3次(可能取决于系统设置)。将会触发更多操作,因此我将必须找到一种在滚动过程中“缓慢”加载数据的方法(节省已请求的行数,将数据加载到单独的线程中)。