本文转自: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. 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片

    [源码下载] 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片 作者:webabcd 介绍与众不同 windows pho ...

  2. Maven创建webapp(二)

    这一节将记录在myeclipse下用maven创建一个简单的webapp项目 web开发maven仓库自动添加组件,故需要需要保持网络的通畅. 打开myeclipse  -->  File  - ...

  3. CentOS6.5 FTP配置

    一:安装vsftpd 查看是否已经安装vsftpd rpm -qa | grep vsftpd 如果没有,就安装,并设置开机启动 yum -y install vsftpd chkconfig vsf ...

  4. ABAP中Conversion Routine示例

          在SAP的Domain定义中,Output Length下面有个Convers. routine的标识,这是SAP用来进行输入输出转换的.我们知道,屏幕上的I/O字段都是字符串形式的,而数 ...

  5. MySQL到MsSQL的迁移工具——SSMA

    SQL Server迁移助手(SSMA)团队开发了针对MySQL的迁移助手Microsoft SQL Server Migration Assistant 2008 for MySQL.微软同时发布了 ...

  6. iOS仿京东分类菜单实例实现

    在APP开发过程中此功能还是比较常见的模块,左边为菜单展示,右边为菜单下数据的展示,选择不同的菜单右边的数据源进行更新,此实例主要运用到UITableView,UICollectionView,OC谓 ...

  7. 在iOS 8中使用UIAlertController

    iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...

  8. iOS 修改label中文字的行间距

    UILabel *label = [[UILabel alloc] init]; label.font = [UIFont systemFontOfSize:]; label.textColor = ...

  9. 在virtualbox下使用vm映像文件

    virtualbox可以直接打开vmdk 创建虚拟机时先不要创建虚拟硬盘. 虚拟机创建成功后,在设置窗口,点击[存储],添加虚拟硬盘,点击选择现有的虚拟盘. 参考链接

  10. Runtime 方法替换 和 动态添加实例方法 结合使用

    前言: 方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法,这个方法可以是类方法也可以是实 ...