NHibernate之 Castle.ActiveRecord中使用分页控件AspNetPager

如果你使用过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));

总体比较简单,自己看看代码,不多说了。


来源:万达源科技

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值