[转]Oracle分页之二:自定义web分页控件的封装

本文转自:http://www.cnblogs.com/scy251147/archive/2011/04/16/2018326.html

上节中,讲述的就是Oracle存储过程分页的使用方式,但是如果大量的页面要使用这个分页存储过程,如果利用上节的方式,势必要书写大量的代码。如何才能够少些代码书写量呢?当然了,利用自定义web控件进行一下封装,也许是一个好方法,但是如何进行封装呢?

首先,就是在项目中添加一个“Web 用户控件“的页面,我们定义为:MyPagination.ascx

然后,就是在这个页面上拖入四个按钮控件和一个label控件,分别为“首页“、”上一页“、”下一页“、”尾页“,然后label控件主要是显示当前的数据记录。但是问题出来了,就是如何将分页的点击事件和其他引用页面的绑定事件给关联起来呢?

当然了,这里我们不得不考虑到C#中的委托事件,这个也许是解决此问题的最好的方法了。当然,如何来做,我们还是得分一二三步走:

首先,在页面上声明事件和委托:

public delegate void HanderMyPagerData(object sender); //委托方法

public static event HanderMyPagerData handerThis; //事件方法

其次,就是在web用户页面中的按钮被点击的时候,将事件抛出去:

public void lbtnFirst_Click(object sender, EventArgs e)

{

int pageCount = ((totalCount % PageCount) == 0) ? (totalCount / PageCount) : ((totalCount / PageCount) + 1);

StartSize = 1;

BindPagerData();

lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";

if (handerThis != null)

{

handerThis((object)BindPagerData());

}

InitPager();

}

看到了没,页面中黄色标注的地方就是事件抛出的地方。在这里,当按钮被点击的时候,代表着换页开始,然后事件会将object类型的数据集传到接收页面,然后进行处理。具体在接收页面如何做呢?

在接收页面,首先需要进行事件注册:

MyPagination.handerThis+=new MyPagination.HanderMyPagerData(MyPagination_handerThis);

然后在MyPagination_handerThis方法中就可以对抛出的事件进行处理了。

private void MyPagination_handerThis(object sender)

{

DataSet ds = sender as DataSet;

GridView1.DataSource = ds;

GridView1.DataBind();

}

大概流程明白了把,现在先来看看自定义web用户控件的代码:

前端部分:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyPagination.ascx.cs" Inherits="MyPagination" %>
<div class="Pager">
<asp:LinkButton ID="lbtnFirst" runat="server" onclick="lbtnFirst_Click">首&nbsp;&nbsp;&nbsp;&nbsp;页</asp:LinkButton>
<asp:LinkButton ID="lbtnPrev" runat="server" onclick="lbtnPrev_Click">上一页</asp:LinkButton>
<asp:LinkButton ID="lbtnNext" runat="server" onclick="lbtnNext_Click">下一页</asp:LinkButton>
<asp:LinkButton ID="lbtnEnd" runat="server" onclick="lbtnEnd_Click">末&nbsp;&nbsp;&nbsp;&nbsp;页</asp:LinkButton>
<asp:Label ID="lblInfo" runat="server"></asp:Label>
</div>

后端部分:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class MyPagination : System.Web.UI.UserControl
{
    public delegate void HanderMyPagerData(object sender); //委托方法
    public static event HanderMyPagerData handerThis;  //事件方法

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

    public static int PageCount { get; set; } //一页显示多少

    public static int startSize=1;  //页面起始数值,初始值为1
    public static int StartSize
    {
        get
        {
            return startSize;
        }
        set
        {
            startSize = value;
        }
    }
    public static string SQL { get; set; } //要进行查询的SQL语句
    public static int totalCount; //总共记录条数

    public static DataSet  BindPagerData()
    {
        DataSet ds = Pagination.PaginationPager(SQL, PageCount, StartSize, out  totalCount);
        return ds;
    }

    public void InitPager()
    {
        if (StartSize <= 1)  //如果当前为第一页
        {
            if (StartSize * PageCount >= totalCount)  //如果当前总条数小于一页的条数  那么按钮全部为不可用状态
            {
                lbtnFirst.Enabled = false;
                lbtnPrev.Enabled = false;
                lbtnNext.Enabled = false;
                lbtnEnd.Enabled = false;
            }
            else  //如果当前总条数大于一页的条数,那么首页  上一页 不可用,下一页 末页 可用
            {
                lbtnFirst.Enabled = false;
                lbtnPrev.Enabled = false;
                lbtnNext.Enabled = true;
                lbtnEnd.Enabled = true;
            }
        }
        else  //如果当前页数不是第一页
        {
            if ((totalCount - StartSize * PageCount) / PageCount == 0)  //表明到达了最后一页
            {
                lbtnFirst.Enabled = true;
                lbtnPrev.Enabled = true;
                lbtnNext.Enabled = false;
                lbtnEnd.Enabled = false;
            }
            else
            {
                lbtnFirst.Enabled = true;
                lbtnPrev.Enabled = true;
                lbtnNext.Enabled = true;
                lbtnEnd.Enabled = true;
            }
        }

        int pageCount = ((totalCount % PageCount) == 0) ? (totalCount / PageCount) : ((totalCount / PageCount) + 1);
        lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";
    }

    public  void lbtnFirst_Click(object sender, EventArgs e)
    {
        int pageCount = ((totalCount % PageCount) == 0) ? (totalCount / PageCount) : ((totalCount / PageCount) + 1);
        StartSize = 1;
        BindPagerData();
        lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";
        if (handerThis != null)
        {
            handerThis((object)BindPagerData());
        }
        InitPager();
    }
    public void lbtnPrev_Click(object sender, EventArgs e)
    {
        int pageCount = ((totalCount % PageCount) == 0) ? (totalCount / PageCount) : ((totalCount / PageCount) + 1);
        if (StartSize > 1)
        {
            StartSize = StartSize - 1;
            BindPagerData();
        }
        lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";

        if (handerThis != null)
        {
            handerThis((object)BindPagerData());
        }
        InitPager();
    }
    public void lbtnNext_Click(object sender, EventArgs e)
    {
        int pageCount = ((totalCount % PageCount) == 0) ? (totalCount / PageCount) : ((totalCount / PageCount) + 1);
        if (StartSize < pageCount)
        {
            StartSize = StartSize + 1;
            BindPagerData();

        }
        lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";
        if (handerThis != null)
        {
            handerThis((object)BindPagerData());
        }
        InitPager();
    }
    public void lbtnEnd_Click(object sender, EventArgs e)
    {
        int pageCount = ((totalCount % PageCount) == 0) ? (totalCount / PageCount) : ((totalCount / PageCount) + 1);
        StartSize = pageCount;
        BindPagerData();
        lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";
        if (handerThis != null)
        {
            handerThis((object)BindPagerData());
        }
        InitPager();
    }
}

接下来就是调用这个web用户控件,只需要将这个控件拉到要使用的页面上,然后页面上会自动生成这个控件的注册代码

<%@ Register src="MyPagination.ascx" tagname="MyPagination" tagprefix="uc1" %>

和服务器控件标识   <uc1:MyPagination ID="MyPagination1" runat="server" />

来看看引用页面的前端全部代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PagerWithDControl.aspx.cs" Inherits="Default2" %>

<%@ Register src="MyPagination.ascx" tagname="MyPagination" tagprefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
     <link href="css/TableZB.css" rel="stylesheet" type="text/css" />
    <link href="css/swcss.css" rel="stylesheet" type="text/css" />
    <link href="css/GridViewCSS_O.css" rel="stylesheet" type="text/css" />
     <style type="text/css">
    .Pager
    {
        margin:10px;
        text-align:right;
        font-weight:bold;
        float:right;
    }
    .Pager a
    {
        margin-left:3px;
        margin-right:3px;
        color:Red;
        width:77px;
        height:27px;
        display:block;
        text-align:center;
        line-height:27px;
        float:left;
        background:url(images/loginButton.gif) no-repeat;

    }
    .Pager a:hover
    {
        color:Blue;
        text-decoration:none;
    }
    .Pager a:visited
    {
        text-decoration:none;
        font-size:12px;
        color:Red;
    }
    .Pager span
    {
        clear:both;
        font-weight:normal;
        font-size:13px;
    }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>

       <asp:GridView CssClass="GVtable" ID="GridView1" runat="server" Width="100%"
        AutoGenerateColumns="False">
        <Columns>
        <asp:TemplateField HeaderText="编号">
        <ItemTemplate>
        <%#Eval("R").ToString() %>
        </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="纳税人识别码">
        <ItemTemplate>
        <%#Eval("nsrsbm").ToString() %>
        </ItemTemplate>
        </asp:TemplateField>
         <asp:TemplateField HeaderText="纳税人名称">
        <ItemTemplate>
        <%#Eval("nsr_mc") %>
        </ItemTemplate>
        </asp:TemplateField>
         <asp:TemplateField HeaderText="登记类型">
        <ItemTemplate>
        <%#Eval("djlx_mc")%>
        </ItemTemplate>
        </asp:TemplateField>
         <asp:TemplateField HeaderText="登记状态">
        <ItemTemplate>
        <%#Eval("dj_ztmc")%>
        </ItemTemplate>
        </asp:TemplateField>
         <asp:TemplateField HeaderText="注册类型">
        <ItemTemplate>
        <%#Eval("zclx_mc")%>
        </ItemTemplate>
        </asp:TemplateField>
         <asp:TemplateField HeaderText="所别">
        <ItemTemplate>
        <%#Eval("gljg_mc")%>
        </ItemTemplate>
        </asp:TemplateField>
         <asp:TemplateField HeaderText="专管员">
        <ItemTemplate>
        <%#Eval("zgy_mc")%>
        </ItemTemplate>
        </asp:TemplateField>
         <asp:TemplateField HeaderText="所属性">
        <ItemTemplate>
        <%#Eval("ssx_mc")%>
        </ItemTemplate>
        </asp:TemplateField>
        </Columns>
    </asp:GridView>
    </div>

    <uc1:MyPagination ID="MyPagination1" runat="server" />
    </form>
</body>
</html>

后端代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        InitGV();  //记住,这里不要用Ispostback判断,否则会导致注册事件不能够正常注册
    }

    private void InitGV()
    {
        MyPagination.PageCount=10;
        MyPagination.SQL = "select nsrsbm,nsr_mc,djlx_mc,dj_ztmc,zclx_mc,gljg_mc,zgy_mc,ssx_mc from scott.t_yhs_djxxtz";
        MyPagination.handerThis+=new MyPagination.HanderMyPagerData(MyPagination_handerThis);
        GridView1.DataSource = MyPagination.BindPagerData();
        GridView1.DataBind();
    }

    private void MyPagination_handerThis(object sender)
    {
        DataSet ds = sender as DataSet;
        GridView1.DataSource = ds;
        GridView1.DataBind();

    }
}

好了,这就是使用的时候,需要写的方法了,首先得有个绑定GridView的方法InitGV(),然后就是得有个处理抛出的事件的方法MyPagination_handerThis(object sender),这个方法中,你可以对传回的数据集进行判断、整合、过滤、绑定等等操作。

时间: 2024-12-20 17:11:59

[转]Oracle分页之二:自定义web分页控件的封装的相关文章

自定义web用户控件ascx

在页面中使每个产品类别都展示重复的样式又想代码简洁,这时就要设置一个自定义控件. 拖入一个Repeater控件设置好样式 在page_load事件下面写一个属性: protected voidPage_Load(object sender, EventArgs e) { if(!isPostBack) { var data=new T_UserTableAdapter().GetDataById(CatId); Repeater1.DataSource=data; //手动绑定控件 Repeat

Entity Framework后台采用分页方式取数据与AspNetPager控件的使用

转载至:http://www.cnblogs.com/jaxu/p/3655582.html 本文是一个对AspNetPager控件使用的笔记! 有关AspNetPager控件可以查看杨涛主页.这是一个开放的自定义ASP.NET控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大,网站开发过程中使用该控件可以省去很多不必要的麻烦. 本页下载:AspNetPager745DLL.zip 然后看一下在页面上如何通过Entity Framework将分页数据传递给该控件以实现真分页. 页面

[转]我要学ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件

本文转自:http://www.cnblogs.com/lukun/archive/2011/08/05/2128693.html 概述   在ASP.NET MVC框架中已经封装了很多基于Html标准的Html控件,我们可以方便的使用这些控件输出想要的内容,使开发变得快捷. 例如ASP.NET MVC框架包括以下设置标准的HTML控件(部分控件): Html.ActionLink() Html.BeginForm() Html.CheckBox() Html.DropDownList() Ht

分享免费的web打印控件puzu

在WEB系统中,打印的确是个烦人的问题----特别是你的应用环境又有很多种类的打印机.如果自己开发打印控件,可能因为项目时间紧而来不及.前段时间有机会接触了一下WEB打印.在博客园.CSDN以及各个论坛上找了老半天,终于顺利的完成了公司项目.现在就结合我的应用体验,将市面上的所有的免费打印控件为大家做一个介绍. 1. DLPrinter 这个打印控件完全免费,界面还不错,使用也较为简单,支持打印预览.直接打印.可设置页眉.页脚.页边距.打印份数.纸张大小等信息,悲剧的是这大哥在07年做了第二次更

web表格控件制作圆环图

工具/原料 web表格控件:FineReport7.1.1 大小:148.2M 适用平台:windows/linux 1. 描述 圆环图类似于饼图,显示个体与整体之间的关系,可以直观了解个体部分所占整体部分的百分比,但是不同于饼图的是,圆环图可以包含多个分类,即多层圆环图,可以从圆环的径向上去比较不同分类下同一系列的数据的变化趋势. 2. 示例 下面我们制作一张圆环图图表,显示各个地区产品的销量情况,在查看每个地区产品销量所在份额的同时,对比同一个产品在不同地区的销量差异情况. 2.1 数据准备

Web端控件,页面传值

一.记忆Web端控件需要配合HTML 中的Form表单元素 Label - 在HTML中被编译成<span> Literal - 在HTML中被编译成空 文本类 文本框      <input type="text">                        TextBox 密码框      <input type="password">                 TextBox 属性TextMode="pa

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作)

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作) 一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1

Silverlight项目笔记5:Oracle归档模式引起的异常&amp;&amp;表格控件绑定按钮

两个问题: (1)Oracle无法连接正常使用,原因是归档日志满了引起异常,最后选择删除归档日志恢复正常. (2)使用silverlight自带的表格绑定按钮竟然无法使用,通过变通绑定数据源集合,把按钮操作作为数据源集合一部分,重新绑定解决. 一.Oracle归档模式产生日志文件引起数据库异常 连接数据库失败,提示监听错误,各种检查监听配置文件,删除再添加监听,无果. sqlplus下重启数据库数据库依然无果,期间碰到多个错误提示: ORA-01034: ORACLE not available

对于四方web打印控件的看法

web打印控件比较多,但是基本都收费.但是四方的虽然不收费,就是得动动手了. 要谈到控件的实用性,便捷性,当然四方的会更胜一筹.在它的demo例子中,像设置默认打印机,纸张自定义大小,页眉页脚,页边距,连续打印等功能都可以轻松的实现. 对于那些需要web打印功能,但囊中羞涩,或者小范围使用,盈利未知的创业项目是比较实用的.如果要正真能够顺畅的使用,随心所欲,付费也是投资成本不可避免的了. 四方web打印控件,使用于IE作为客户端的所有应用,与服务器端开发语言无关,即PAZU支持所有的开发语言开发