简易的分页用户控件处理Oracle数据的分页

简介:
近来一直从事Oralce数据的开发工作,处理一些报表,由于数据比较大,因此要求需要进行一定的分页处理,以便提高效率,但由于这些报表是一种轻便的开发模式,不希望引入太多的复杂的东西,而且这些报表有的是用Sql检索数据的,有些是用存储过程的。
由于基本上每个报表都会使用到分页的部分,因此这些内容最好是作为控件的方式,以便减少代码,我原来的文章中有介绍过的分页控件《 查询控件、分页控件、页面展示控件,我的Web开发三大得力助手》,这个分页控件样式很不错,不过是基于Sql进行分页的,因此我在这个基础上编写了一个用户控件来处理界面和分页内容就可以了。
这个分页控件(使用用户控件模式)减少了很多重复的代码,可以较好适应存储过程或者是Sql查询的情况,当然也具有我一贯的软件风格,好的界面。
下面我看看弄好的用户控件和页面的整合效果图先。

我们在设计时看看分页控件的界面如下所示:


这个用户控件的后台代码如下所示
    public partial class PagerControl : System.Web.UI.UserControl
    {
        
public EventHandler OnDataBind = null;
        
public BasePage parentPage = null;

        
protected void Page_Load(object sender, EventArgs e)
        {
        }

        
public void BindData(PagerInfo pageInfo)
        {
            parentPage.CurrentPage 
= pageInfo.CurrentPage;
            parentPage.PageCount 
= pageInfo.PageCount;
            parentPage.RecordCount 
= pageInfo.RecordCount;

            
this.lblCurrentPage.Text = parentPage.CurrentPage.ToString();
            
this.lblPageCount.Text = parentPage.PageCount.ToString();
            
this.lblRecordCount.Text = parentPage.RecordCount.ToString();
            
this.txtAbsolutePage.Text = parentPage.CurrentPage.ToString();
            
this.ddlPageSize.SelectedValue = parentPage.PageSize.ToString();
        }

        
protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
        {
            
int pageSize = StringUtil.toInteger(this.ddlPageSize.SelectedValue);
            
if (pageSize > 0)
            {
                parentPage.PageSize 
= pageSize;
                parentPage.CurrentPage 
= 1;
            }

            
if (OnDataBind != null)
            {
                OnDataBind(sender, e);
            }
        }

        
protected void btnGo_Click(object sender, ImageClickEventArgs e)
        {
            
int gotoPage = StringUtil.toInteger(this.txtAbsolutePage.Text);
            parentPage.CurrentPage 
= gotoPage;

            
if (OnDataBind != null)
            {
                OnDataBind(sender, e);
            }
        }

        
protected void btnFirst_Click(object sender, ImageClickEventArgs e)
        {
            parentPage.CurrentPage 
= 1;
            
if (OnDataBind != null)
            {
                OnDataBind(sender, e);
            }
        }

        
protected void btnPrevious_Click(object sender, ImageClickEventArgs e)
        {
            parentPage.CurrentPage 
= parentPage.CurrentPage -1;
            
if (OnDataBind != null)
            {
                OnDataBind(sender, e);
            }
        }

        
protected void btnNext_Click(object sender, ImageClickEventArgs e)
        {
            parentPage.CurrentPage 
= parentPage.CurrentPage + 1;
            
if (OnDataBind != null)
            {
                OnDataBind(sender, e);
            }
        }

        
protected void btnLast_Click(object sender, ImageClickEventArgs e)
        {
            parentPage.CurrentPage 
= parentPage.PageCount;
            
if (OnDataBind != null)
            {
                OnDataBind(sender, e);
            }
        }
有了这个分页控件的界面部分,我们就不需要在每个界面中重复这些代码和控制内容了。
我们在Visual Studio中,把用户控件拖动到具体需要分页的页面中的具体位置就完成了界面的设计了,这样可以减少很多重复的代码,下面我们来看看具体的页面调用部分就知道代码是否整洁很多了。
     public   partial   class  CounterStatByCar : BasePage
    {
        
protected   void  Page_Load( object  sender, EventArgs e)
        {
            
this .PagerControl1.parentPage  =   this ;
            
this .PagerControl1.OnDataBind  +=   new  EventHandler(BindDataHandler);
        }
        
private   void  BindDataHandler( object  sender, EventArgs e)
        {
            BindData();
        }

        
private  DataTable BindData()
        {
            DataTable dt 
=   null ;
            
try
            {                
                PagerInfo pageInfo 
=   new  PagerInfo();
                pageInfo.CurrentPage 
=   this .CurrentPage; // 读取BasePage中的ViewState信息,当前页面
                pageInfo.PageSize  =   this .PageSize;     // 读取BasePage中的ViewState信息,页面大小

                dt 
=  dal.GetCounterStatByCar(beginTime, endTime, carPlate,  ref  pageInfo).Tables[ 0 ];
                DataView dv 
=  dt.DefaultView;
                
this .dg.DataSource  =  dv;
                
this .dg.DataBind();

                
this .PagerControl1.BindData(pageInfo); // 更新页面数据
            }
            
catch  (Exception ex)
            {
                LogHelper.Error(ex);
                Helper.Alerts(
this " 获取数据出错 " );
            }
            
return  dt;
        }

        
protected   void  btnNormalSearch_Click( object  sender, ImageClickEventArgs e)
        {
            
this .CurrentPage  =   1 ;
            BindData();
        }
}
上面的 GetCounterStatByCar是一个获取分页数据的函数,由于在方法中传入了分页必须要的信息,当前页,页面大小,数据检索后,会修改总记录数量和页面总数量的,这些信息会显示在分页控件中。我们看看PagerInfo的类代码:
    [Serializable]
    
public   class  PagerInfo
    {
        
private   int  currenetPageIndex  =   1 // 当前页码
         private   int  pageSize  =   20 ; // 每页显示的记录
         private   int  recordCount  =   0 ; // 记录总数

        
#region  属性变量

        
///   <summary>
        
///  获取或设置当前页码
        
///   </summary>
        [XmlElement(ElementName  =   " CurrentPageIndex " )]
        
public   int  CurrentPage
        {
            
get  {  return  currenetPageIndex; }
            
set  { currenetPageIndex  =  value; }
        }

        
///   <summary>
        
///  获取或设置每页显示的记录
        
///   </summary>
        [XmlElement(ElementName  =   " PageSize " )]
        
public   int  PageSize
        {
            
get  {  return  pageSize; }
            
set  { pageSize  =  value; }
        }

        
///   <summary>
        
///  获取或设置记录总数
        
///   </summary>
        [XmlElement(ElementName  =   " RecordCount " )]
        
public   int  RecordCount
        {
            
get  {  return  recordCount; }
            
set  { recordCount  =  value; }
        }

        
///   <summary>
        
///  共有多少页
        
///   </summary>
        [XmlElement(ElementName  =   " PageCount " )]
        
public   int  PageCount
        {
            
get
            {
                
if  (recordCount  ==   0   ||  pageSize  ==   0 )
                {
                    
return   0 ;
                }
                
else
                {
                    
int  fullPage  =  recordCount  /  pageSize; 
                    
int  left  =  recordCount  %  pageSize;
                    
if  (left  >   0 )
                    {
                        fullPage 
+=   1 ;
                    }
                    
return  fullPage;
                }
            }
        }

        
#endregion
在BasePage中,我们需要添加几个方法,用来做ViewSate的调用的。
        #region  分页的变量

        
///   <summary>
        
///  每页的记录数量
        
///   </summary>
         public   int  PageSize
        {
            
get
            {
                
return  GetViewState( " PageSize " 20 );
            }
            
set
            {
                SetViewState(
" PageSize " , value);
            }
        }

        
///   <summary>
        
///  共有几页
        
///   </summary>
         public   int  PageCount
        {
            
get
            {
                
return  GetViewState( " PageCount " 0 );
            }
            
set
            {
                SetViewState(
" PageCount " , value);
            }
        }

        
///   <summary>
        
///  总的记录数量
        
///   </summary>
         public   int  RecordCount
        {
            
get
            {
                
return  GetViewState( " RecordCount " 0 );
            }
            
set
            {
                SetViewState(
" RecordCount " , value);
            }
        }

        
///   <summary>
        
///  当前页码
        
///   </summary>
         public   int  CurrentPage
        {
            
get
            {
                
return  GetViewState( " CurrentPage " 1 );
            }
            
set
            {
                
int  pageIndex  =  (value  >=  PageCount)  ?  PageCount : value;
                pageIndex 
=  (pageIndex  <=   1 ?   1  : pageIndex;
                SetViewState(
" CurrentPage " , pageIndex);
            }
        } 
        
#endregion

        
public   string  GetViewState( string  name,  string  defaultValue)
        {
            
if  (ViewState[name]  !=   null )
            {
                
return  ViewState[name].ToString();
            }
            
else
            {
                
return  defaultValue;
            }
        }

        
public   bool  GetViewState( string  name,  bool  defaultValue)
        {
            
if  (ViewState[name]  !=   null )
            {
                
return  ( bool )ViewState[name];
            }
            
else
            {
                
return  defaultValue;
            }
        }

        
public   int  GetViewState( string  name,  int  defaultValue)
        {
            
if  (ViewState[name]  !=   null )
            {
                
return  ( int )ViewState[name];
            }
            
else
            {
                
return  defaultValue;
            }
        }

        
public   void  SetViewState( string  name,  object  value)
        {
            ViewState[name] 
=  value;
        }

        
#endregion
本文转自博客园伍华聪的博客,原文链接:简易的分页用户控件处理Oracle数据的分页,如需转载请自行联系原博主。


目录
相关文章
|
5天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
2月前
|
SQL Oracle 关系型数据库
Oracle 将表中的数据查出更改某一字段的值后再插入该表
Oracle 将表中的数据查出更改某一字段的值后再插入该表
32 2
|
2月前
|
存储 Oracle NoSQL
Oracle 表空间、数据文件、schema的关系
Oracle 表空间、数据文件、schema的关系
39 2
|
2月前
|
SQL Oracle 关系型数据库
Oracle查询优化-查询只包含数字或字母的数据
【2月更文挑战第4天】【2月更文挑战第10篇】查询只包含数字或字母的数据
88 1
|
3月前
|
Oracle 关系型数据库
Oracle查询优化-从表中随机返回N条数据
【1月更文挑战第2天】【1月更文挑战第5篇】有些场景需要抽验数据,例如为了防止做假或者抽检行为,就需要随机抽查。
45 0
|
3月前
|
Oracle 关系型数据库 数据库
Oracle查询优化-复制表的定义及数据
【1月更文挑战第5天】【1月更文挑战第14篇】在Oracle数据库中,复制表定义和复制表数据是两个常见的操作。
51 1
|
5天前
|
Oracle 安全 关系型数据库
Oracle数据守卫(DG):数据的“守护者”与“时光机”
【4月更文挑战第19天】Oracle Data Guard保障数据安全,通过实时维护备库实现故障切换,保证业务连续性。它使用日志传输和应用保持数据同步,如同“时光机”,借助闪回技术能恢复误操作数据。此外,它还提供数据压缩、加密和故障转移等功能,提升数据库安全性与性能。作为数据管理员,理解并善用Data Guard是确保企业数据安全的关键。
|
5天前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
5天前
|
存储 Oracle 关系型数据库
Oracle 12c的多重索引:数据的“多维导航仪”
【4月更文挑战第19天】Oracle 12c的多重索引提升数据查询效率,如同多维导航仪。在同一表上创建针对不同列的多个索引,加速检索过程。虽然过多索引会增加存储和维护成本,但合理选择和使用索引策略,结合位图、函数索引等高级特性,能优化查询,应对复杂场景。数据管理员应善用这些工具,根据需求进行索引管理,支持企业数据分析。
|
5天前
|
存储 Oracle 数据管理
Oracle 12c的自动数据优化(ADO)与热图:数据管理的“瘦身”与“透视”艺术
【4月更文挑战第19天】Oracle 12c的ADO和热图技术革新数据管理。ADO智能清理无用数据,优化存储,提升查询速度,实现数据&quot;瘦身&quot;;热图则以直观的视觉表示展示数据分布和状态,助力识别性能瓶颈,犹如数据的&quot;透视&quot;工具。这两项技术结合,强化数据管理,为企业业务发展保驾护航。

推荐镜像

更多