本文转自: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
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 <= ) //如果当前为第一页
{
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 == ) //表明到达了最后一页
{
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) == ) ? (totalCount / PageCount) : ((totalCount / PageCount) + );
lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";
} public void lbtnFirst_Click(object sender, EventArgs e)
{
int pageCount = ((totalCount % PageCount) == ) ? (totalCount / PageCount) : ((totalCount / PageCount) + );
StartSize = ;
BindPagerData();
lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";
if (handerThis != null)
{
handerThis((object)BindPagerData());
}
InitPager();
}
public void lbtnPrev_Click(object sender, EventArgs e)
{
int pageCount = ((totalCount % PageCount) == ) ? (totalCount / PageCount) : ((totalCount / PageCount) + );
if (StartSize > )
{
StartSize = StartSize - ;
BindPagerData();
}
lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页"; if (handerThis != null)
{
handerThis((object)BindPagerData());
}
InitPager();
}
public void lbtnNext_Click(object sender, EventArgs e)
{
int pageCount = ((totalCount % PageCount) == ) ? (totalCount / PageCount) : ((totalCount / PageCount) + );
if (StartSize < pageCount)
{
StartSize = StartSize + ;
BindPagerData(); }
lblInfo.Text = "当前第" + StartSize + "页,总共" + pageCount + "页";
if (handerThis != null)
{
handerThis((object)BindPagerData());
}
InitPager();
}
public void lbtnEnd_Click(object sender, EventArgs e)
{
int pageCount = ((totalCount % PageCount) == ) ? (totalCount / PageCount) : ((totalCount / PageCount) + );
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=;
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),这个方法中,你可以对传回的数据集进行判断、整合、过滤、绑定等等操作。

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

  1. Web用户控件开发--分页控件

    分页是Web应用程序中最常用到的功能之一,在ASP.NET中,虽然自带了一些可以分页的数据控件,但其分页功能并不尽如人意.本文对于这些数据控件的假分页暂且不表,如有不明白的同学请百Google度之. ...

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

    本文是一个对AspNetPager控件使用的笔记! 有关AspNetPager控件可以查看杨涛主页.这是一个开放的自定义ASP.NET控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大, ...

  3. WPF教程十二:了解自定义控件的基础和自定义无外观控件

    这一篇本来想先写风格主题,主题切换.自定义配套的样式.但是最近加班.搬家.新租的房子打扫卫生,我家宝宝6月中旬要出生协调各种的事情,导致了最近精神状态不是很好,又没有看到我比较喜欢的主题风格去模仿的, ...

  4. 网页WEB打印控件

    网页WEB打印控件制作 在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的 ...

  5. Web打印控件Lodop实现表格物流单的打印

    Web打印控件Lodop实现表格物流单的打印 一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用 ...

  6. WEB打印控件Lodop(V6.x)使用说明及样例

    WEB打印控件Lodop(V6.x)使用说明及样例 Lodop是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码生成复杂打印页. 控件功能强大,却简单易用,所有调用如同JavaScript扩展 ...

  7. 示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本

    原文:示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本 一.目的:封装了一些控件到自定义的控件库中,方便快速开发 二.实现功能: 基本实现常 ...

  8. ASP.NET Web数据控件

    ASP.NET Web数据控件 1.数据控件简介 这包括数据源控件和格式设置控件,前者使您可以使用 Web 控件访问数据库中的数据,后者使您可以显示和操作ASP.NET 网页上的数据.  2.数据控件 ...

  9. Web用户控件

    用户控件是个什么东西?自定义的反复重用的控件集合 注意:创建好用户控件后,必须添加到其他web页中才能显示出来,不能直接作为一个网页来显示,因此也就不能设置用户控件为“起始页”. 用户控件与ASP.N ...

随机推荐

  1. JPHP试用笔记

    JPHP试用指南 编译 环境准备 有JDK 1.6 的环境 Gradle 1.4 以上 具体配置略过,git签出https://github.com/dim-s/jphp/代码后,看readme.md ...

  2. idea使用maven搭建springmvc

    最近学着搭建springmvc,写此博客记录一下 idea版本:2016.3.1maven: apache-maven-3.3.9tomcat:apache-tomcat-8.5.8 1.New Pr ...

  3. [moka同学笔记]window下redis的安装以及php-redis详细配置(摘录)

    (注意对应的版本)下载地址:https://github.com/phpredis/phpredis/downloads 首先下载redis安装,windows下安装软件都是下一步下一步over,就不 ...

  4. python面向对象(一),Day6

    connfigparser模块 xml模块 shutil模块以及压缩解压 subprocess模块 面向对象(上) 类和对象 onfigParser 用于对特定的配置进行操作,当前模块的名称在 pyt ...

  5. H5前端面试题及答案(1)

    前几天去面试了一家公司,整下改公司的面试题. 1.新的 HTML5 文档类型和字符集是? HTML5 文档类型很简单: <!doctype html> HTML5 使用 UTF-8 编码示 ...

  6. .NET破解之太乐地图下载器【非暴破】

    不知不觉,接触破解逆向已经三个月了,从当初的门外汉到现在的小白,这个过程只有经历过才知道其中的苦与乐: 有无知.困惑.痛苦.惊喜.彻悟.欣慰…… 有无助的软件脱壳,茫然的代码分析,有无趣的反复测试, ...

  7. Create a “% Complete” Progress Bar with JS Link in SharePoint 2013

    Create a “% Complete” Progress Bar with JS Link in SharePoint 2013 SharePoint 2013 has a lot new fea ...

  8. 转:HTTP 1.1与HTTP 1.0的比较

    原文地址:http://blog.csdn.net/elifefly/article/details/3964766 HTTP 1.1与HTTP 1.0的比较 一个WEB站点每天可能要接收到上百万的用 ...

  9. linux服务器如何设置目录权限,让开发只能在测试目录下开发,不在线上目录上开发

    当一台服务器上,既有测试环境,也有生成的环境,开发需要在线上测试,如果开发生产环境的权限,那开发容易误操作 需求如下: (1)生产环境的代码,必须有专用的账号登陆进行管理 (2)开发测试环境的代码,开 ...

  10. 【读书笔记】iOS-查看一个软件ipa包的内容

    一,打开itunes----->我的iPhone应用程序. 二,右键点击app---->在Finder中显示---->出现下图所示界面. 三,将上图中的ipa包拷贝到桌面,如下图所示 ...