C# 委托和事件

来源:互联网 发布:油画笔什么牌子好 淘宝 编辑:程序博客网 时间:2024/05/05 17:16
委托:

它是一种数据类型,和引用类型类似,不过和一般的类相比,委托的实例不是在堆中的数据,而是一个方法。

和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);    }




原创粉丝点击