[转]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">首 页</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">末 页</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分页控件的封装的更多相关文章
- Web用户控件开发--分页控件
分页是Web应用程序中最常用到的功能之一,在ASP.NET中,虽然自带了一些可以分页的数据控件,但其分页功能并不尽如人意.本文对于这些数据控件的假分页暂且不表,如有不明白的同学请百Google度之. ...
- Entity Framework后台采用分页方式取数据与AspNetPager控件的使用
本文是一个对AspNetPager控件使用的笔记! 有关AspNetPager控件可以查看杨涛主页.这是一个开放的自定义ASP.NET控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大, ...
- WPF教程十二:了解自定义控件的基础和自定义无外观控件
这一篇本来想先写风格主题,主题切换.自定义配套的样式.但是最近加班.搬家.新租的房子打扫卫生,我家宝宝6月中旬要出生协调各种的事情,导致了最近精神状态不是很好,又没有看到我比较喜欢的主题风格去模仿的, ...
- 网页WEB打印控件
网页WEB打印控件制作 在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的 ...
- Web打印控件Lodop实现表格物流单的打印
Web打印控件Lodop实现表格物流单的打印 一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用 ...
- WEB打印控件Lodop(V6.x)使用说明及样例
WEB打印控件Lodop(V6.x)使用说明及样例 Lodop是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码生成复杂打印页. 控件功能强大,却简单易用,所有调用如同JavaScript扩展 ...
- 示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本
原文:示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本 一.目的:封装了一些控件到自定义的控件库中,方便快速开发 二.实现功能: 基本实现常 ...
- ASP.NET Web数据控件
ASP.NET Web数据控件 1.数据控件简介 这包括数据源控件和格式设置控件,前者使您可以使用 Web 控件访问数据库中的数据,后者使您可以显示和操作ASP.NET 网页上的数据. 2.数据控件 ...
- Web用户控件
用户控件是个什么东西?自定义的反复重用的控件集合 注意:创建好用户控件后,必须添加到其他web页中才能显示出来,不能直接作为一个网页来显示,因此也就不能设置用户控件为“起始页”. 用户控件与ASP.N ...
随机推荐
- 怎样用C#代码屏蔽任务管理器?
这是我在网上找的并多加了一些我自己需要的代码,经过我的测试,可以屏蔽任务管理器,但还有一些瑕疵. 首先,我在vs2012中新建一个项目,选择window下的window窗体应用程序,把窗体form1拉 ...
- 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解
[源码下载] 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Toa ...
- [python学习笔记]Day3
函数 如: def is_leapyear(year): if (year%4 == 0 and year%100 != 0) or (year%400 == 0): return True else ...
- Android5.0新特性——图片和颜色(drawable)
图片和颜色 tint属性 tint属性一个颜色值,可以对图片做颜色渲染,我们可以给view的背景设置tint色值,给ImageView的图片设置tint色值,也可以给任意Drawable或者NineP ...
- Xml序列化、反序列化帮助类
之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...
- Cache&Session Viewer
用于查看和删除网站Cache https://github.com/sdf333/Aspy
- JSDoc那些事
几天工作上需要文档化一些Javascript东西,所以在找一些JS文档化工具,以下分析几种工具. 1.JSDoc-toolkit 一开始还想用这个工具,但后来在解析生成文档时候,出现了很严重的错误,还 ...
- ASP.NET MVC 微信公共平台开发之获取用户消息并处理
ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...
- ArcGIS快捷键导出
在以前的文章中说过怎样恢复ArcGIS默认界面.今天同事的电脑用ArcMap打开数据后,移动或缩放数据时莫名的闪动. 于是使用排除法来查找原因:(1)先以为是数据的原因,换个数据还是有问题:(2)后以 ...
- 用js实现在加载完成一个页面后自动执行一个方法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...