如果你使用过AspNetPager,如果你想在Castle.ActiveRecord集成的NHibernate下使用AspNetPager ,如果你不知道如何使用分页方法 SlicedFindAll并使用分页控件 AspNetPager ,那么,这篇文章就是为您准备的:
下面是我封装的(5个重载,不会使用SlicedFindAll的话多看看,以期引玉)SlicedFindAll分页算法:
为便于封装,我使用的是ActiveRecordMediator.SlicedFindAll(),大家也可以使用继承了ActiveRecordBase的实体类Entity.SlicedFindAll(),即:ActiveRecordBase.SlicedFindAll()。
#region 分页算法
/// <summary>
/// ActiveRecord分页方法For AspNetPager
/// <para> 例: Order[] orderby = new Order[] { new Order("Xh", true) };</para>
/// <para>zdyqxs = ServiceComponent.FindSlicedRecords(typeof(XtzdyQxEntity), AspNetPager1, out count, orderby, Expression.Eq("GroupMc", "自定义权限"));</para>
/// <para>解志杰注 2011年7月23日 16:24:33</para>
/// </summary>
/// <param name="targetType">结果集目标类型</param>
/// <param name="pager">分页控件AspNetPager</param>
/// <param name="count">数据总数</param>
/// <param name="orders">排序</param>
/// <param name="criteria">条件</param>
/// <returns></returns>
public static Array FindSlicedRecords(System.Type targetType, AspNetPager pager,out int count, Order[] orders, params ICriterion[] criteria)
{
count = ActiveRecordMediator.Count(targetType, criteria);
int FirstResult = (pager.CurrentPageIndex - 1) * pager.PageSize;
return ActiveRecordMediator.SlicedFindAll(targetType, FirstResult, pager.PageSize, orders, criteria);
}
/// <summary>
/// 此方法不带返回 数据总数 的Count,因而需要使用者自己书写Count代码
/// <para>例:new DetachedQuery(SelectHql).SetParameter(0,"解志杰").SetParameter("sex","男")</para>
/// <para>解志杰注 2011年7月23日 17:39:41</para>
/// </summary>
/// <param name="targetType">结果集目标类型</param>
/// <param name="pager">分页控件AspNetPager</param>
/// <param name="detachedQuery"></param>
/// <returns></returns>
public static Array FindSlicedRecords(System.Type targetType, AspNetPager pager,IDetachedQuery detachedQuery)
{
int FirstResult = (pager.CurrentPageIndex - 1) * pager.PageSize;
return ActiveRecordMediator.SlicedFindAll(targetType, FirstResult, pager.PageSize, detachedQuery);
}
/// <summary>
/// 此方法仅用于HQL语句不需要传入参数的情况(不可用拼接SQL的方式将参数拼接进去)
/// <para>解志杰注 2011年7月23日 17:37:39</para>
/// </summary>
/// <param name="targetType">结果集目标类型</param>
/// <param name="pager">分页控件AspNetPager</param>
/// <param name="SelectHql">SelectHql</param>
/// <param name="CountHql">CountHql</param>
/// <param name="count">数据总数</param>
/// <returns></returns>
public static Array FindSlicedRecords(System.Type targetType, AspNetPager pager, String SelectHql, String CountHql,out int count)
{
ScalarQuery<int> sq = new ScalarQuery<int>(targetType, CountHql);
count = sq.Execute();
int FirstResult = (pager.CurrentPageIndex - 1) * pager.PageSize;
return ActiveRecordMediator.SlicedFindAll(targetType, FirstResult, pager.PageSize, new DetachedQuery(SelectHql));
}
/// <summary>
/// 此方法仅用于不需要额外使用任何条件的情况
/// <para>解志杰注 2011年7月23日 17:43:27</para>
/// </summary>
/// <param name="targetType">结果集目标类型</param>
/// <param name="pager">分页控件AspNetPager</param>
/// <param name="count">数据总数</param>
/// <returns></returns>
public static Array FindSlicedRecords(System.Type targetType, AspNetPager pager, out int count)
{
count = ActiveRecordMediator.Count(targetType);
int FirstResult = (pager.CurrentPageIndex - 1) * pager.PageSize;
return ActiveRecordMediator.SlicedFindAll(targetType, FirstResult, pager.PageSize);
}
/// <summary>
/// 此方法仅用于不需要额外使用任何条件的情况(带排序功能)
/// <para>解志杰注 2011年7月23日 18:10:16</para>
/// </summary>
/// <param name="targetType">结果集目标类型</param>
/// <param name="pager">分页控件AspNetPager</param>
/// <param name="orderHql">排序Hql语句</param>
/// <param name="count">数据总数</param>
/// <returns></returns>
public static Array FindSlicedRecords(System.Type targetType, AspNetPager pager,string orderHql, out int count)
{
count = ActiveRecordMediator.Count(targetType);
string hql = "from " + targetType.Name + " " + orderHql;
int FirstResult = (pager.CurrentPageIndex - 1) * pager.PageSize;
return ActiveRecordMediator.SlicedFindAll(targetType, FirstResult, pager.PageSize, new DetachedQuery(hql));
}
#endregion
下面是分页控件的触发事件(用的是上面最后一个重载方法):
/// <summary>
/// 分页控件事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
int count = 0;
IList zdyqxs = ServiceComponent.FindSlicedRecords(typeof(XtczyEntity), AspNetPager1, " order by UserLoginZh", out count);
this.ShowData(GridView1, AspNetPager1, zdyqxs, count, PagerSkin.None);
}
下面是封装的ShowData()方法,其中的参数PagerSkin,及方法InitPagerSkin(aspNetPager, pagerSkin);是我封装的样式,看的时候不用在意它:
/// <summary>
/// 实现将用分页算法查询出的“一页结果集”在控件上进行呈现
/// 解志杰注 2009年6月10日 17:34:29
/// </summary>
/// <param name="gridView">页面的 GridView 控件ID</param>
/// <param name="aspNetPager">页面的AspNetPager控件ID</param>
/// <param name="DataSource">DataView、Array等结果集对象(只一页的数据)</param>
/// <param name="count">数据库中全部记录数</param>
protected void ShowData(GridView gridView, AspNetPager aspNetPager, IEnumerable DataSource, int count, PagerSkin pagerSkin)
{
aspNetPager.RecordCount = count;
InitPagerSkin(aspNetPager, pagerSkin);
gridView.DataSource = DataSource;
gridView.DataBind();
aspNetPager.Visible = true;
}
分页关键代码在AspNetPager1_PageChanged(object sender, EventArgs e)中的:
IList zdyqxs = ServiceComponent.FindSlicedRecords(typeof(XtczyEntity), AspNetPager1, " order by UserLoginZh", out count);
以及FindSlicedRecords()中的:
int FirstResult = (pager.CurrentPageIndex - 1) * pager.PageSize; return ActiveRecordMediator.SlicedFindAll(targetType, FirstResult, pager.PageSize, new DetachedQuery(hql));
总体比较简单,自己看看代码,不多说了。
来源:万达源科技