65.9K
CodeProject 正在变化。 阅读更多。
Home

DeleGrid:委托的分页

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.80/5 (4投票s)

2007年12月18日

CPOL

3分钟阅读

viewsIcon

27172

downloadIcon

207

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 的实例,其中包含当前数据页的起始索引以及页面中的记录数。它还包含 SortFieldSortDirection,在 grid 上启用排序时使用。但是,在此示例中我们未使用它们。

最后,我们只需要在页面加载时绑定 grid 即可。我们不会在回发时重新绑定 grid ,因为它在 DeleGrid 中进行了内部处理。

protected override void OnLoad(EventArgs eventArgs)
{
  base.OnLoad(eventArgs);

  if (!IsPostBack)
    grid.DataBind();
}

就是这样!

您不需要使用委托,普通的事件处理程序语法也可以(并且可能更适合大型示例)。我这样做只是为了简洁起见。

进一步阅读...

测试

我写了少量的测试,尽可能地涵盖了 grid 的实现。我只想尽可能远地测试该控件,因为它与 ASP.NET 实现密切相关。在不使用诸如 NUnitASP 之类的东西的情况下,这可能会变得非常混乱,这对于一个控件来说有点太多了。我涵盖了大约 85% 的代码,我认为这已经很合理了。

排序

如上所述,您可以通过访问事件参数的 SortFieldSortDirection 属性来在处理程序中实现排序。

DeleGrid.AlwaysRequestTotal 属性

默认情况下,DeleGrid 仅在初始数据绑定时请求记录总数。但是,如果您认为这是一个问题(例如,数据快速变化的数据集),您可能希望将此属性设置为 true 以便它在每次数据绑定时刷新总数。

开源

DeleGrid 在新的 BSD 许可证下是开源的。阅读许可证以了解您被允许执行的操作。

源代码也可以从 Subversion here 访问(使用用户 jagregory-read-only)。

历史

  • 1.0 - 初始发布
© . All rights reserved.