简易的分页用户控件处理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数据的分页,如需转载请自行联系原博主。


目录
相关文章
|
12天前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
3月前
|
SQL 运维 Oracle
【迁移秘籍揭晓】ADB如何助你一臂之力,轻松玩转Oracle至ADB的数据大转移?
【8月更文挑战第27天】ADB(Autonomous Database)是由甲骨文公司推出的自动化的数据库服务,它极大简化了数据库的运维工作。在从传统Oracle数据库升级至ADB的过程中,数据迁移至关重要。
68 0
|
3月前
|
数据采集 Oracle 关系型数据库
实时计算 Flink版产品使用问题之怎么实现从Oracle数据库读取多个表并将数据写入到Iceberg表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
12天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
12天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。
|
1月前
|
Oracle 关系型数据库 数据库
oracle数据创建同义词
oracle数据创建同义词
51 0
|
3月前
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
50 0
|
3月前
|
SQL Oracle 关系型数据库
Oracle误删数据怎么恢复?
Oracle误删数据怎么恢复?
47 0
|
3月前
|
SQL Oracle Java
实时计算 Flink版产品使用问题之采集Oracle数据时,为什么无法采集到其他TABLESPACE的表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
分布式计算 Oracle 关系型数据库
实时计算 Flink版产品使用问题之获取Oracle的数据时无法获取clob类型的数据,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。