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

来源:互联网 发布:隐藏图标的软件 编辑:程序博客网 时间:2024/06/06 21:06

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

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


来源:万达源科技