2004-6-28+ 用户控件(添加事件)

既然用户控件可以有自己的属性,那也一样可以有自己的事件。给自己的控件添加一个事件有的时候往往可以解决大难题,比如说我们要做一个登陆控件,就可以给它添加一个自己的提交事件,这样当提交的时候可以方便的取得回传值。如果没有自己的事件,该怎么判断登陆控件的按钮点击事件呢?
添加事件是一个麻烦的过程,首先得有对“事件和委托”的认识,对这方面不熟悉的朋友可以找有关方面的资料看一下,我在这里恐怕讲不清楚,因为我也是想了好几天才明白过来。下面我们来看怎么给登陆控件添加一个login事件。
我们可以在ascx文件中定义一个事件,然后在aspx文件中订阅这个事件。当按钮被单击提交资料时,产生事件,发布通知,这样aspx文件就可以收到信息并且进入处理这个事件的方法中。

---本文所用登陆控件下载------
uc_event是用户控件中的类,uc_eventx是aspx页中的类。
先来看.ascx.cs中事件的定义和发布:
public class uc_event : System.Web.UI.UserControl
{

   //定义该事件使用的委托
   public delegate void loginhandler(object sender,loginEventArgs e);
   //定义事件
   public event loginhandler login;
   //这个是当用户控件中的按钮被单击时引发的事件,在这里触发我们定义的登陆事件
   private void butlogin_Click(object sender, System.EventArgs e)
   {
   //判断是否被订阅
      if(login!=null)
      {
        loginEventArgs el=new loginEventArgs();
        //事件发生
        login(this,el);
      }
   }
}
在这里,事件的触发是通过按钮单击事件实现的。这块代码位于.ascx.cs的用户控件类中。
loginEventArgs的定义:
//EventArgs派生类,放置事件信息
public class loginEventArgs : System.EventArgs
{

   //定义一个事件信息
   public string starttime
   {
     get
     {
       return System.DateTime.Now.ToString();
     }
   }
}
最后就是.aspx.cs中的对事件的订阅。一般来说,事件的订阅都是放在InitializeComponent()方法中,因此我们也把对login事件的订阅放到这里面:
public class uc_eventx : System.Web.UI.Page
{

   protected prac.uc_event uclogin=new uc_event();
   private void InitializeComponent()
   {
      this.Load += new System.EventHandler(this.Page_Load);
      //订阅用户控件的事件
      this.uclogin.login+=new prac.uc_event.loginhandler(uclogin_login);
   }
   //响应事件
   private void uclogin_login(object sender, loginEventArgs e)
   {
      Response.Write("hello usercontrol's event"+"<br>"+e.starttime);
   }
}
这样就完成啦。
现在来看一下整个过程。
C#中的事件机制为:对象可以发布一组事件供其他类订阅。当发布类产生事件时,所有订阅类都会得到通知。
先往前一点,说说事件和委托的工作机制。一个事件发生,都应该有触发条件,在这里为按钮的单击。(要注意的是,按钮的单击也是一个事件,我们实际上是在处理按钮单击事件的方法中印发login事件的)当事件发生且有订阅者的时候,就会向订阅者发送一个类似于“事件发生啦”的消息。订阅者得到通知后,便启动事件处理方法来进行进一步的操作。而事件处理方法也不是随便乱写的,它必须符合事件委托(delegate)中定义的方法签名。在c#中,一般的事件处理方法签名为:返回类型为void,有两个参数,参数1是提供事件的来源(即发布者),类型为object;参数2是提供事件的信息,类型为EventArgs的派生类。
我们把这个用户控件插入到aspx页中后,实际上就是在uc_eventx类中创建了一个uc_event类的实例,而一个aspx页则是一个uc_eventx类的实例。现在我们是在uc_event类中发布一个事件,然后在uc_eventx类中订阅这个事件。当用户单击用户控件所属的按钮时,引发了uc_event类中的login事件,因为uc_eventx类订阅了这个事件,所以uc_event类把事件发生的消息发送给uc_evenx类。uc_eventx类得到了事件发生的通知,便使用指定的事件处理方法来处理这个事件。

大体就是这样,有了这个事件,我们就可以方便的取回登陆控件中的值,并且进行其他操作。

posted on 2006-06-29 09:27  Notus|南色的风  阅读(611)  评论(2编辑  收藏  举报