委托:
后台:
它是一种数据类型,和引用类型类似,不过和一般的类相比,委托的实例不是在堆中的数据,而是一个方法。
和C++中的函数指针很相似,但对函数指针更安全,。将函数打包成一个变量进行传递。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
事件:
事件实现了对委托的封装,是一个特殊的委托
下面看一下代码(一个分页功能):
下面是用户控件的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public delegate void PageChangeHandler(int nPageIndex);
public partial class Common_PagerControl : System.Web.UI.UserControl
{
public event PageChangeHandler OnPageChange;
private int _PageCount = 0;//页数
private int _RecordCount = 0;//数量
private int _PageIndex = 1;//当前页数
protected void Page_Load(object sender, EventArgs e)
{
}
//总页数
public int PageCount
{
get
{
return int.Parse(this.LblPageCount.Text);
}
set
{
_PageCount = value;
/*
if (_PageCount < 2)
{
//this.txtNewPageIndex.Enabled = false;
//this.LnkBtnGoto.Enabled = false;
}
else
{
//this.txtNewPageIndex.Enabled = true;
//this.LnkBtnGoto.Enabled = true;
}
*/
this.LblPageCount.Text = _PageCount.ToString();
}
}
//总条数
public int RecordCount
{
get
{
return int.Parse(this.LblRecordCount.Text);
}
set
{
_RecordCount = value;
this.LblRecordCount.Text = _RecordCount.ToString();
}
}
//当前第几页
public int PageIndex
{
get
{
return int.Parse(this.LblPageIndex.Text);
}
set
{
_PageIndex = value;
this.txtNewPageIndex.Text = this.LblPageIndex.Text = _PageIndex.ToString();
if (_PageIndex < 2)
{
this.LnkBtnFirst.Enabled = false;
this.LnkBtnPrevious.Enabled = false;
}
else
{
this.LnkBtnFirst.Enabled = true;
this.LnkBtnPrevious.Enabled = true;
}
if (_PageIndex >= _PageCount)
{
this.LnkBtnNext.Enabled = false;
this.LnkBtnLast.Enabled = false;
}
else
{
this.LnkBtnNext.Enabled = true;
this.LnkBtnLast.Enabled = true;
}
}
}
//第一页
protected void LnkBtnFirst_Click(object sender, EventArgs e)
{
try
{
OnPageChange(1);
}
catch { }
}
//上一页
protected void LnkBtnPrevious_Click(object sender, EventArgs e)
{
try
{
int n = Convert.ToInt32(this.LblPageIndex.Text);//当前的页数
n--;
if (n > 0)
{
OnPageChange(n);
}
}
catch
{
throw;
}
}
//下一页
protected void LnkBtnNext_Click(object sender, EventArgs e)
{
try
{
int n = Convert.ToInt32(this.LblPageIndex.Text);
n++;
if (n <= Convert.ToInt32(this.LblPageCount.Text))
{
OnPageChange(n);
}
}
catch (Exception ex)
{
throw (ex);
}
}
//最后一页
protected void LnkBtnLast_Click(object sender, EventArgs e)
{
try
{
int n = Convert.ToInt32(this.LblPageCount.Text);
OnPageChange(n);
}
catch
{
throw;
}
}
//跳到指定页
protected void LnkBtnGoto_Click(object sender, EventArgs e)
{
int n;
try
{
n = Convert.ToInt32(this.txtNewPageIndex.Text);
}
catch
{
n = Convert.ToInt32(this.LblPageIndex.Text);
}
int np = Convert.ToInt32(this.LblPageCount.Text.Trim());
if (n > np)
n = np;
if (n < 1)
n = 1;
OnPageChange(n);
}
}
下面是页面引用代码:
页面:
<%@ Register Src="../../Common/PagerControl.ascx" TagName="PagerControl" TagPrefix="uc1" %>
<tr align="right" bgcolor="#f9fcef">
<td height="36" colspan="13" align="middle">
<%--<div class="pagelistbox" runat="server" id="ddpagelist" name="ddpagelist">
</div>--%>
<uc1:PagerControl ID="PagerControl1" runat="server" />
</td>
</tr>
后台:
protected void Page_Load(object sender, EventArgs e)
{ //给分页控件注册的事件
this.PagerControl1.OnPageChange += new PageChangeHandler(PageNavigator1_PageChange);
if (!IsPostBack)
{
ListDataBind(1);
}
}
/// <summary>
/// 给分页控件注册的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="PageIndex">当前页</param>
protected void PageNavigator1_PageChange(int PageIndex)
{
ListDataBind(PageIndex);
}