DeleGrid:委托的分页






3.80/5 (4投票s)
DeleGrid 是一个从 ASP.NET GridView 派生的控件,它将数据检索委托回控件之外。
本文也维护在 我的博客上。
介绍 DeleGrid
DeleGrid
是一个从 ASP.NET GridView
派生的控件,它将数据检索委托回控件之外。这允许开发人员完全控制检索到的记录,从而允许使用任何首选的集合类型实现正确的分页。
背景
DeleGrid
的出现是因为我希望使用 NHibernate
实现分页,而 grid
不需要知道它。我真的不希望 NHibernate
离开我的数据层,所以我需要一种好方法让 grid
使用分页参数调用我的 DAL。
使用 DeleGrid
在获取源代码或程序集并进行通常的步骤后,将对该控件的引用添加到您的页面中
<%@ Register Assembly="JAGregory.Controls.DeleGrid"
Namespace="JAGregory.Controls" TagPrefix="jag" %>
然后创建该控件的实例,打开分页功能并设置正确的分页大小
<jag:DeleGrid ID="grid" runat="server" AllowPaging="true" PageSize="4" />
现在您已经设置了一个控件,但是它仍然无法正确绑定。因此,您需要在代码隐藏中附加事件处理程序。
protected override void OnInit(EventArgs eventArgs)
{
base.OnInit(eventArgs);
grid.TotalRecordCountRequest += delegate {
// code to get total
};
}
从 TotalRecordCountRequest
开始,当 grid
需要知道您的 grid
总共将显示多少条记录时,会引发此事件。这个数字是所有页面的累积计数。我将使用一个简单的存储库模式来分离我的 DAL 逻辑。
OnInit
方法现在是
protected override void OnInit(EventArgs eventArgs)
{
base.OnInit(eventArgs);
ProductRepository repos = new ProductRepository();
grid.TotalRecordCountRequest += delegate {
return repos.GetTotal();
};
}
现在您的 grid
知道了它总共有多少条记录,但是我们还没有告诉它如何实际获取数据。现在我们需要将代码放入 PageDataRequest
处理程序中。当 grid
需要新的一页数据时,会引发此事件。这将在初始数据绑定时调用一次,然后每次您更改页面(或排序等)时再次调用。
OnInit
方法现在是
protected override void OnInit(EventArgs eventArgs)
{
base.OnInit(eventArgs);
ProductRepository repos = new ProductRepository();
grid.TotalRecordCountRequest += delegate {
return repos.GetTotal();
};
grid.PageDataRequest += delegate(object sender, DataRequestEventArgs e) {
return repos.GetRange(e.Start, e.Size);
};
}
事件处理程序接收 DataRequestEventArgs
的实例,其中包含当前数据页的起始索引以及页面中的记录数。它还包含 SortField
和 SortDirection
,在 grid
上启用排序时使用。但是,在此示例中我们未使用它们。
最后,我们只需要在页面加载时绑定 grid
即可。我们不会在回发时重新绑定 grid
,因为它在 DeleGrid
中进行了内部处理。
protected override void OnLoad(EventArgs eventArgs)
{
base.OnLoad(eventArgs);
if (!IsPostBack)
grid.DataBind();
}
就是这样!
您不需要使用委托,普通的事件处理程序语法也可以(并且可能更适合大型示例)。我这样做只是为了简洁起见。
进一步阅读...
测试
我写了少量的测试,尽可能地涵盖了 grid
的实现。我只想尽可能远地测试该控件,因为它与 ASP.NET 实现密切相关。在不使用诸如 NUnitASP
之类的东西的情况下,这可能会变得非常混乱,这对于一个控件来说有点太多了。我涵盖了大约 85% 的代码,我认为这已经很合理了。
排序
如上所述,您可以通过访问事件参数的 SortField
和 SortDirection
属性来在处理程序中实现排序。
DeleGrid.AlwaysRequestTotal 属性
默认情况下,DeleGrid
仅在初始数据绑定时请求记录总数。但是,如果您认为这是一个问题(例如,数据快速变化的数据集),您可能希望将此属性设置为 true
以便它在每次数据绑定时刷新总数。
开源
DeleGrid
在新的 BSD 许可证下是开源的。阅读许可证以了解您被允许执行的操作。
源代码也可以从 Subversion here 访问(使用用户 jagregory-read-only)。
历史
- 1.0 - 初始发布