2.委托式的事件处理和重载式的事件处理

  阅读目录

  一:ASP.NET窗口事件处理

  二:委托式的事件处理模式

  三:重载式的事件处理模式

  一:ASP.NET窗口事件处理

  . 事件驱动是窗口程序设计的核心,不了解事件驱动就无法进入窗口程序设计的殿堂

  . Windows中的事件和ASP.NET中的事件的区别是什么?

  在Windows中我们的机器是单一的,我们的机器即是服务器也是客户端就是一台机器,在Windows中你点击了按钮就是服务器当中的按钮,所以正儿八经的就是面向事件的编程,而在ASP.NET中,你点击的是客户端的按钮,执行的确实服务器端的事件,虽然它们是服务器控件最终会在浏览器中呈现出来,所以对于一千个人,一万个人看到的是同一个控件,这么多人点击了按钮,实际上通过客户端来点击的,最后执行的是服务器端的事件,看似好像是点击服务器端的按钮,这实际上是有一个模拟的过程,是通过javascript的一个函数模拟服务器端的事件

  . 在C#主要有两种事件处理模式,无论是WindowsAPP还是ASP.NET

  -委托式的事件处理模式

  -重载式的事件处理模式

  二:委托式的事件处理模式
  . 委托式的事件处理模式,就是将特定的事件委托给负责事件处理的方法来进行
  . 在.NET中,类有数据成员(属性),函数成员(方法),事件成员(事件),事件成员就是那些与该类的对象相关的事件
  . 事件处理可以通过委托关系来进行,委托关系关系这样来建立object.Event+=new EventHandle(Method);它的含义就是如果对象object发生了Event事件,就交由方法Method来处理,一个对象可以委托多个不同的处理,“+=”用来增加新的委托关系
  . Method是真正进行事件处理的地方,格式为:public void Method(object sender, EventArgs e);object sender指是触发事件的按钮,也就是触发事件的控件,EventArgs是.NETFramework中有关事件的基础类,所有发生的事件都被包装成EventArgs类或者其子类的对象,当事件发生时,Method会收到这两个参数,一旦建立了委托关系,系统自动的会在特定事件发生时,转而执行你所委托的事件处理方法

  . 我们看看服务器端事件背后到底发生了什么

  1:Default.aspx 设计文件

  

  2:Default.aspx.cs 代码文件

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  using System.Web.UI;
  using System.Web.UI.WebControls;

  namespace ServerEvent
  {
      public partial class _Default : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              this.btnTwo.Click += new EventHandler(this.btnTwo_Click);
          }

          /// <summary>
          ///  设计时添加事件,什么叫“设计时添加事件”就是我们从工具箱拖一个按钮,双击添加的一个事件
          /// </summary>
          /// <param name="sender"></param>
          /// <param name="e"></param>
          protected void btnOne_Click(object sender, EventArgs e)
          {

       //实际上是在背后生成了这样一段代码 this.btnOne.Click += new EventHandler(this.btnOne_Click);把Click事件和btnOne_Click事件处理函数关联起来了
                Response.Write("设计时添加事件");
          }

          /// <summary>
          ///  运行时添加事件,如果你没有从工具箱拖一个按钮双击添加了一个事件,那么可以采用运行时添加事件
          /// </summary>
          /// <param name="sender"></param>
          /// <param name="e"></param>
          protected void btnTwo_Click(object sender, EventArgs e)
          {
              Response.Write("运行时添加事件");
          }
      }
  }

  三:重载式的事件处理模式
  . 在C#中,针对不同类所相关的事件,除了定义有事件成员外,也定义了可重载的事件方法,可通过重载这些事件方法来设计你所希望的对应事件处理,说白了就是在C#中,好多类都提供了一些可以重载的事件方法,就是它已经定义好了这些事件了,只不过我们需要通过派生类中自己重新去定义一下就行了

  . 这些可重载的事件方法名称皆为“On”开头,而且被声明为“virtual”,一个被声明为“virtual”的方法就代表它可以被重载,被声明为“onverride”的方法也代表它可以被重载,如果声明为“abstract”则表示它必须被重载,例如:按钮的Click事件,就有一个对应的可重载的OnClick事件方法

  . 把按钮控件重载了,把它派生成一个类,然后把它需要的方法重载了,自定义控件的好处就是可以在好多地方使用,这就是代码的可重复性

  我们可以从”对象浏览器“来看Web服务器控件有哪些事件方法可以重载

  

  1:MyCustomButtonControl.cs ASP.NET服务器控件类

  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Linq;
  using System.Text;
  using System.Web;
  using System.Web.UI;
  using System.Web.UI.WebControls;

  namespace ServerControl
  {
      [DefaultProperty("Text")]
      [ToolboxData("<{0}:MyButton runat=server></{0}:MyButton>")]
      //“MyButton”指的是我的自定义按钮控件,从“Button”派生一个我自定义的Button
      public class MyButton : System.Web.UI.WebControls.Button
      {
          [Bindable(true)]
          [Category("Appearance")]
          [DefaultValue("")]
          [Localizable(true)]
          public new string Text
          {
              get
              {
                  String s = (String)ViewState["Text"];
                  return ((s == null) ? "[" + this.ID + "]" : s);
              }

              set
              {
                  ViewState["Text"] = value;
              }
          }

          protected override void OnClick(EventArgs e)
          {
              this.Page.Response.Write("重载式的事件处理模式");
          }

          protected override void RenderContents(HtmlTextWriter output)
          {
              output.Write(Text);
          }
      }
  }

  2:添加我们自定义的Button控件

    在工具箱选择“选择项”,然后选择我们MyCustomButtonControl.cs编译好的dll就行了

    

  3:Default.aspx 设计文件

  拖动“MyButton”到我们的页面

  

  

  

  

posted @ 2012-03-13 15:14  David.Meng  阅读(779)  评论(0编辑  收藏  举报