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类得到了事件发生的通知,便使用指定的事件处理方法来处理这个事件。
大体就是这样,有了这个事件,我们就可以方便的取回登陆控件中的值,并且进行其他操作。
添加事件是一个麻烦的过程,首先得有对“事件和委托”的认识,对这方面不熟悉的朋友可以找有关方面的资料看一下,我在这里恐怕讲不清楚,因为我也是想了好几天才明白过来。下面我们来看怎么给登陆控件添加一个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类得到了事件发生的通知,便使用指定的事件处理方法来处理这个事件。
大体就是这样,有了这个事件,我们就可以方便的取回登陆控件中的值,并且进行其他操作。