zoukankan      html  css  js  c++  java
  • HqlBuilder之二(使用AspNetPager分页控件)

    上次写了HqlBuilder,实现了用一个Filter类,来描述要生成的查询.但在列表时,我们不应该把所以的东西都列出来,我们应该只列一页的数据,往往是10条就足够了.所以,在很多页面使用了Filter来查询的情况下,如果对每个函数都加上参数,来传递要第几页的几条数据时,改动会很大.

    我想到,一般情况下,一个页面只有一个查询.(我的项目中如此,具体问题具体对待).这样我们可以在一个Http交互中,在Thread中保存这两个参数来实现.然后在生成查询时,应用

    query.SetFirstResult(firstResult).SetMaxResults(pageSize);

    来只返回我们要求的数据.

    至于控件,我选择了AspNetPager 这样就要求我们每次页面变化时,都要把相应的参数传递到Thread的变量中,我的方法是写一个控件,直接继承Wuqi.AspnetPager,像下面一样:

        public class AspNetPager : Wuqi.Webdiyer.AspNetPager
        {
            
    protected override void OnInit(EventArgs e)
            {
                
                
    base.OnInit(e);

                
    this.Page.Load += new EventHandler(Page_Load);
            }

            
    void Page_Load(object sender, EventArgs e)
            {
                
    if (!Page.IsPostBack)
                {
                    
    //如果页面加载,就设置一下控件的样式
                    this.CustomInfoHTML = "第%CurrentPageIndex%页,共%PageCount%页,每页%PageSize%条";
                   
    this.ShowCustomInfoSection = Wuqi.Webdiyer.ShowCustomInfoSection.Right;

                    
    //把参数保存到 HqlBuilderPagerParameter ,这是一个Thead相关的变量 
                    HqlBuilderPagerParameter.Current.SetPager(Math.Max(0,this.StartRecordIndex), this.PageSize);
                }
            }

            
    protected override void OnPageChanged(EventArgs e)
            {
                
                
    base.OnPageChanged(e);
               
    //把参数保存到 HqlBuilderPagerParameter ,这是一个Thead相关的变量
                HqlBuilderPagerParameter.Current.SetPager(this.StartRecordIndex, this.PageSize);

                
    //参数发生变动,我们需要重新绑定
                Control ctl = this.Parent;
                while(!(ctl is UserControlBase))
                {
                    ctl = ctl.Parent;
                }

                if (ctl is UserControlBase)
                {
                    ctl.DataBind();
                }

            }
        }

    这样,我们就把所需要的参数,传到了HqlBuilder.最后写一个Filter基类,用来保存查询的总记录数:

        public class HqlBuildFilterBase<T> : HqlBuildFilterBase
        {
            
    public override Type ClassType
            {
                
    get { return typeof(T); }
            }
        }

        [HqlPager]
        
    public abstract class HqlBuildFilterBase
        { 
            
    public abstract Type ClassType{get;}

            
    private long resultCount = 0;

            
    /// <summary>
            
    /// 记录总数
            
    /// </summary>
            public long ResultCountLong
            {
                
    get { return resultCount; }
                
    set { resultCount = value; }
            }

            
    public int ResultCount
            {
                
    get { return (int)resultCount; }
            }
        }

     最后,我们只要把查询的Filter类改成从  HqlBuildFilterBase<T>类继承,就可以了.

        #region Search_Object
        
    public class UserInfoFilter : HqlBuildFilterBase<UserInfo>
        {
            
    private string logName = null;
            
    private string name = null;


            [HqlCondition( EnumHqlCondition.Like)]
            
    public string LogName
            {
                
    get
                {
                    
    if (string.IsNullOrEmpty(logName))
                        
    return null;
                    
    else
                        
    return logName;
                }
                
    set
                {
                    logName 
    = value;
                }
            }

            [HqlCondition( EnumHqlCondition.Like)]
            
    public string Name
            {
                
    get
                {
                    
    if (string.IsNullOrEmpty(name))
                        
    return null;
                    
    else
                        
    return name;
                }
                
    set
                {
                    name 
    = value;
                }
            }

            [HqlCondition]
            
    public DicDept DicDept = null;

            [HqlCondition(
    "UserRole.RoleInfo", EnumHqlCondition.EQ)]
            
    public RoleInfo RoleInfo = null;

            [HqlCondition(
    "DicUseFlag", EnumHqlCondition.NE)]
            
    public DicUseFlag Deleted = DicUseFlag.CreateInstance((int)Enums.EnumUseFlag.Deleted);

            [HqlOrder]
            
    public string Order = "Id asc";
        }
        
    #endregion

     前台只要添加

       <asp:GridView ID="gvList" runat="server" 
            onselectedindexchanging
    ="gvList_SelectedIndexChanging" onrowdeleting="gvList_RowDeleting" 
            AutoGenerateColumns
    ="False">
            
       
    </asp:GridView>
            
    <div class="footer">
                
    <div class="pager">
                    
    <facade:aspnetpager id="pagerList" runat="server" HorizontalAlign="Center"
                        Width
    ="100%" PageIndexBoxType="DropDownList"
                        PageSize
    ="10"  ></facade:aspnetpager>
                
    </div>
            
    </div> 

     后台记得要在绑定后:更新一下总记录数:

            public override void DataBind()
            {
                
    this.gvList.DataSource = GetDataSource();
                
    this.gvList.DataKeyNames = new string[] { "Id" };
                
    //this.gvList.DataBind();

                
    this.pagerList.RecordCount = this.filter.ResultCount;

                
    base.DataBind();

            }

    最后是完整代码:

    完整代码
  • 相关阅读:
    LeetCode-Search a 2D Matrix
    Cocos2d-x 学习(1)—— 通过Cocos Studio创建第一个Demo
    SpringMVC经典系列-12基于SpringMVC的文件上传---【LinusZhu】
    poj 2126 Factoring a Polynomial 数学多项式分解
    [每天读书半小时] 2015-6-8 设计模式
    LeetCode_Path Sum II
    MySql截取DateTime字段的日期值
    Fiddler2 中文手册
    fiddler2抓包工具使用图文教程
    Fiddler2 抓取手机APP数据包
  • 原文地址:https://www.cnblogs.com/evlon/p/1346456.html
Copyright © 2011-2022 走看看