欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈ASP.NET中最简单的自定义控件

程序员文章站 2024-02-14 17:39:34
asp.net用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持。本文讨论用户控件返回事件的方法。  假定用户控件(usercontrol....

asp.net用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持。本文讨论用户控件返回事件的方法。

 假定用户控件(usercontrol.ascx)中包含按钮控件abutton,希望实现按abutton按钮时,包含该用户控件的页面可以接收到事件。为此,小鸡射手在用户控件和页面的代码中分别作了处理。

        usercontrol.ascx.cs中的处理:
        1. 定义public的事件委托,如clickeventhandler;
        2. 在usercontrol类中声明事件,如click;
        3. 在usercontrol类中定义引发事件的方法,如onclick()方法;
        4. 在usercontrol类的相关方法中调用引发事件的方法,如在button_click()中调用onclick()。

        核心代码示意如下:

复制代码 代码如下:

        public delegate void clickeventhandler(object sender, eventargs e);
        public class myusercontrol : system.web.ui.usercontrol
        {
           protected system.web.ui.webcontrols.button abutton;
           public event clickeventhandler click;
           protected void onclick(eventargs e)
           {
               if (click!=null) click(this, e);
           }
           private void abutton_click(object sender, system.eventargs e)
           {
               this.onclick(e);
           }
        }

 
包含usercontrol的页面cs文件中的处理:

     1. initializecomponent()中增加事件处理程序,采用findcontrol方法找到usercontrol;
     2. 定义事件处理方法,在该方法中处理usercontrol的事件,如usercontrol_clicked()。
核心代码示意如下:

复制代码 代码如下:

     private void initializecomponent()
     {   
           this.load += new system.eventhandler(this.page_load);
           myusercontrol uc = this.findcontrol("myusercontrolid") as myusercontrol;
           uc.click += new clickeventhandler(this.usercontrol_clicked);
     }
     private void usercontrol_clicked(object sender, system.eventargs e)
     {
           // usercontrol_clicked event hanlder
     }

总结一下,其实就是将事件机制利用手工编程的方法加进去:加入一般控件ide自动生成的代码。顺便说一下,c#的事件机制实现了obeserver pattern,除了ui还可以用于业务层,能有效地降低对象间的耦合度,像usercontrol那样,根本无需知道包含它的页面对象是谁!