本文转自: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. Win7如何部署apache服务器(包括SSL设置)

    部署普通站点 1.首先下载apache24版本,下载地址为http://pan.baidu.com/s/1pLmvDgB; 2.解压到你的电脑本地目录,如D:\Apache24(下文配置都会以当前目录 ...

  2. 【JS复习笔记】02 对象与函数

    好吧,因为很重要的事情,几天没写笔记了. 关于对象: ||可以用来填充默认值,如:myApp.name || "无" &&可以用来避免错误,myApp.NameOb ...

  3. tomcat+webservice实现简单的web服务远程调用接口

    1,准备工作:    ①需要使用到jaxws的一系列架包,网址:http://jax-ws.java.net,我下的是比较新的一个版本(下载好以后吧架包发在lib下),②webservice的一个工具 ...

  4. php获取textarea的值并处理回车换行的方法

    //注:\n是用双引号包的的,双引号!!双引号!!! explode("\n",$row[0]['value']

  5. Thumbnailator压缩图片

    Thumbnailator是一款不可多得的处理图片的第三方工具包,它写法简单到让人无法相信,Java本身也有处理图片压缩的方法,但是代码冗长到让人痛不欲生,在篇末会给出Java本身的实现方式,做下对比 ...

  6. [iOS] 使用xib作为应用程序入口 with IDE

    [iOS] 使用xib作为应用程序入口 with IDE 在「使用xib做为应用程序入口 with Code」这篇文章中,介绍了如何透过写Code的方式,来使用xib做为应用程序的入口.但其实在Xco ...

  7. DOM应用实例(寻找房祖名)

    在上一篇我讲到了DOM的一些总结,这一次我就用我前几天做的一个游戏demo来讲讲DOM的一些用法吧. 首先简单说说这个游戏,如下图所示(大家忽略样式/(ㄒoㄒ)/~~).当玩家点击开始后,只要选择了正 ...

  8. Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39

    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39 V1  初步实现sina csdn cnblogs V2  实现qzone sohu 的发帖 ...

  9. Microsoft Dynamics CRM 2011/2013 JS操作集锦

    1.Xrm.Page.context用户ID:getUserId()用户角色:getUserRoles()用户语言:getUserLcid()组织名称:getOrgUniqueName()组织语言:g ...

  10. OC中NSDictionary和NSSet简单操作

    /** *  字典 存放键值对类型的数据 存放数据是无序的 */ // 字典在控制台输出是用{}包括起来的 // NSDictionary 不可变字典 // 1.创建对象 // 初始化方法 NSDic ...