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

时间: 2024-12-25 10:27:36

简易的分页用户控件处理Oracle数据的分页的相关文章

ASP.NET数据列表控件的分页总结(三)Asp.Net可定制分页用户控件

前一篇文章是采用存储过程来进行分页的,但是存在缺陷,没有代码重用,针对不同的表或者不同的视图都需要去编写存储过程,这样很麻烦,代码的重用性很差.本文将通过一个用户控件来实现数据分页的页面层以达到代码重用的目的. 分页是借助用户自定义控件来实现,在这里主要有以下两种方法来实现: (一).吴旗娃的AspNetPager组件(推荐使用) 首先,下载该dll文件. 在工具箱中,鼠标右键,"选择项",添加刚下载的dll文件. 然后,将会在工具箱中看到一个AspNetPager分页控件,拖到页面,

Asp.Net可定制分页用户控件

今天研究了以下Asp.Net 可定制分页,用起来很爽,下面给大家介绍下. 借助 Asp.Net 提供的数据绑定控件,我们无需太多的代码,甚至不需要代码,只要在 VS2005 中拖拽几下控件,进行一些属性的设置,便可以实现在Asp时代需要做大量工作才能够实现的分页功能.但在实际的应用中,尤其是在Web站点程序中,我们经常需要更加丰富的用户界面,而类似DataList或者 GridView 这样的数据控件往往不能或者很难满足我们的要求.此时,我们常常求助于 Repeater 控件,这样我们依旧会面临

ASP.NET 用户控件的使用介绍_实用技巧

页面上访问用户控件中的数据:  方法一:        使用用户控件的FindControl方法,找到用户控件中的控件,进一步取得其数据(不需要在控件中处理,但是需要知道用户控件中要使用的控件的ID)方法二: 为控件增加属性(方法),使用该属性访问用户控件中的数据(在目标页面中使用时,简单,但是不够灵活) 用户控件中访问页面控件中的控件:  方法一:  在用户控件中使用Parent属性找到页面,再通过FindControl方法找到要访问的控件 方法二: 为用户控件添加事件,在页面中处理事件,进而

Asp.net url分页的用户控件

asp.net|分页|控件 最近做一个相册程序频繁的需要分页,所以就想写一个用户控件出来.      代码如下:      AutoPage.ascx页面      <%@ Control Language="c#" AutoEventWireup="false" Codebehind="AutoPage.ascx.cs" Inherits="album.AutoPage" TargetSchema="http

Asp.Net其他页面如何调用Web用户控件写的分页

  这篇文章主要介绍了Asp.Net其他页面如何调用Web用户控件写的分页,需要的朋友可以参考下 在要添加分页的页面加载时添加以下代码:(以图书分类为例) Paging p = Paging1; //Web用户控件的ID p.DataControl = gvBookType; //要绑定数据的控件(此处是GridView) p.TableName = "BookShop_BookType"; p.Sort = "asc"; p.Column = "Book

Asp.Net其他页面如何调用Web用户控件写的分页_实用技巧

在要添加分页的页面加载时添加以下代码:(以图书分类为例) 复制代码 代码如下: Paging p = Paging1; //Web用户控件的ID p.DataControl = gvBookType; //要绑定数据的控件(此处是GridView) p.TableName = "BookShop_BookType"; p.Sort = "asc"; p.Column = "BookType_ID";

编程“方便面”之用户控件

学习使用.net已经有数个年头,从使用.net进行cs开发,到现在做Web开发,一直都是想当然的写着. 敲着.知道有一天,一个java开发者问我一个问题,我虽然将java语言已经还给母校了,但是还是可以读 懂的.在我尝试解决它的问题的时候,发现那哥们无法理解我的想法,他是用eclipse开发java的,java 组的一位资深的技术员过来后,对我的解决方法也是不感冒,问我为什么要那么写呢?为什么要那么爱用 控件呢?而且不是很认同控件这种将特别功能需求进行封装的编程方式.但是作为一个已经.net语言

将ASP.NET UpdatePanel控件与用户控件一起使用

可以像为网页上的其他控件启用部分页更新一样为用户控件启用部分页更新.必须向页添加 ScriptManager 控件,并将其 EnablePartialRendering 属性设置为 true.ScriptManager 控件将管理 UpdatePanel 控件的部分页更新,这些控件直接位于 ASP.NET 网页上或位于页上的用户控件内. 在一个简单的方案中,可以将用户控件置于更新面板内,当对更新面板的内容进行更新时,将刷新这 些用户控件.也可以将 UpdatePanel 控件置于用户控件内,从而

asp.net-RequiredFieldValidator在web用户控件中的使用

问题描述 RequiredFieldValidator在web用户控件中的使用 各位大大,小弟用vs2010开发一个程序, 新建了一个web用户控件,里面设置了姓名,年龄等字段的验证,不能为空. 但是我引用这个web用户控件的页面,放置了一个button,按下button,页面并不能先验证,再提交. button的ValidationGroup也和web用户控件里的RequiredFieldValidator的ValidationGroup一致,请教如何解决啊? 难道必须把button放在web