上节中,讲述的就是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用户控件的代码:
前端部分:
<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.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" />
来看看引用页面的前端全部代码:
<%@ 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.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),这个方法中,你可以对传回的数据集进行判断、整合、过滤、绑定等等操作。
最终的效果图如下: