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();

        }

 

 

最后是完整代码:

完整代码

 

 

 

posted @ 2008-12-03 10:14  阿牛  阅读(2322)  评论(0编辑  收藏  举报