当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  ASP.NET 2.0服务器控件之复合控件事件1

 ASP.NET 2.0服务器控件之复合控件事件1

点击次数:30 次 发布日期:2008-11-26 12:18:40 作者:源代码网
源代码网推荐      在上面一篇文章中,我们讨论了有关创建复合控件的基本理论,并且通过一个典型应用掌握了复合控件的呈现方法。本文将继续讲解有关创建复合控件的内容,重点是为复合控件实现事件的具体方法。
源代码网推荐  
源代码网推荐    复合控件的事件处理简介
源代码网推荐  
源代码网推荐    谈到自定义控件的事件处理问题,这在前面的系列文章中已经进行讲解。由前文可知,实现控件事件的核心主要是定义事件属性结构和事件处理程序等。然而,这些内容是构建所有自定义服务器控件的基础。仅仅依靠这些方法是无法实现复合控件的事件的。因为,复合控件中包含子控件,这就使得复合控件的事件处理变得复杂起来。显而易见,在复合控件的事件实现过程中,需要面临的最大问题是:由于不允许开发人员直接访问子控件(虽然通过Controls集合访问的方法可以实现,但是破坏了程序的封装性,因此是不被允许的),如果子控件的事件不能作为顶级事件引发,那么将无法实现子控件的事件处理。简单的说,即如何实现子控件的事件上传。所谓事件上传是指把子控件的事件暴露为顶级事件,这样父控件可以检查到事件,并按照定义来执行相关事件处理程序。
源代码网推荐  
源代码网推荐    由以上内容可知,复合控件的事件处理,主要是实现子控件事件上传的过程。下面将介绍两种常用的事件上传实现方法:包含法和冒泡法。这两种方法实现机理不同,然而,完成了同样的功能。在下文中,我们将通过理论结合示例的方法展开讲解。
源代码网推荐  
源代码网推荐    包含法
源代码网推荐  
源代码网推荐    包含法的核心是,通过在子控件的事件处理程序中调用复合控件的顶层事件处理程序,以完成子控件的事件上传。在执行过程中,当引发子控件事件后,子控件的事件处理程序将自动调用相关顶层事件处理程序。
源代码网推荐  
源代码网推荐    包含法的关键步骤如下:
源代码网推荐  
源代码网推荐    · 在CreateChildControls方法中,为子控件添加事件处理程序。
源代码网推荐  
源代码网推荐    · 定义顶层事件及其事件处理程序OnEventName。
源代码网推荐  
源代码网推荐    · 在子控件的事件处理程序中调用OnEventName。
源代码网推荐  
源代码网推荐    · 定义事件属性结构。
源代码网推荐  
源代码网推荐    由以上内容可知,包含法的步骤与前面文章中介绍的实现控件的方法基本类似。关键是多出了一个在CreateChildControls方法中,为子控件添加事件处理程序的步骤。为了读者能够更加清晰的理解包含法,下文列举了一个利用包含法为复合控件实现事件的示例。
源代码网推荐  
源代码网推荐    首先,利用上一篇文章中介绍的复合控件呈现方法,创建一个由文本框和按钮组成的复合控件,然后,使用上文所述的包含法,将按钮的Click事件上传为顶层事件Submit。下面列举了该控件的源代码。
源代码网推荐  
源代码网推荐  using System;
源代码网推荐  using System.Web.UI;
源代码网推荐  using System.Web.UI.WebControls;
源代码网推荐  using System.ComponentModel;
源代码网推荐  using System.ComponentModel.Design;
源代码网推荐  namespace WebControlLibrary{
源代码网推荐   public class CompositeEvent : CompositeControl {
源代码网推荐    //声明变量
源代码网推荐    private Button _button;
源代码网推荐    private TextBox _textBox;
源代码网推荐    private static readonly object EventSubmitKey = new object();
源代码网推荐    //定义属性ButtonText,用于指定按钮上的文字
源代码网推荐    [
源代码网推荐     Bindable(true), Category("Appearance"), DefaultValue(""), Description("获取或设置显示显示在按钮上的文字")
源代码网推荐    ]
源代码网推荐    public string ButtonText {
源代码网推荐     get {
源代码网推荐      EnsureChildControls();
源代码网推荐      return _button.Text;
源代码网推荐     }
源代码网推荐     set {
源代码网推荐      EnsureChildControls();
源代码网推荐      _button.Text = value;
源代码网推荐     }
源代码网推荐    }
源代码网推荐    //定义属性Text,表示文本框的输入
源代码网推荐  
源代码网推荐    [
源代码网推荐     Bindable(true), Category("Appearance"), DefaultValue(""), Description("获取或设置文本框输入文本")
源代码网推荐    ]
源代码网推荐    public string Text {
源代码网推荐     get {
源代码网推荐      EnsureChildControls();
源代码网推荐      return _textBox.Text;
源代码网推荐     }
源代码网推荐     set {
源代码网推荐      EnsureChildControls();
源代码网推荐      _textBox.Text = value;
源代码网推荐     }
源代码网推荐    }
源代码网推荐    // 实现事件属性结构
源代码网推荐    public event EventHandler Submit {
源代码网推荐     add {
源代码网推荐      Events.AddHandler(EventSubmitKey, value);
源代码网推荐     }
源代码网推荐     remove {
源代码网推荐      Events.RemoveHandler(EventSubmitKey, value);
源代码网推荐     }
源代码网推荐    }
源代码网推荐    // 实现OnSubmit
源代码网推荐    protected virtual void OnSubmit(EventArgs e) {
源代码网推荐     EventHandler SubmitHandler = (EventHandler)Events[EventSubmitKey];
源代码网推荐     if (SubmitHandler != null) {
源代码网推荐      SubmitHandler(this, e);
源代码网推荐     }
源代码网推荐    }
源代码网推荐    // 实现Submit事件引发的事件处理程序
源代码网推荐    private void _button_Click(Object source, EventArgs e) {
源代码网推荐     OnSubmit(EventArgs.Empty);
源代码网推荐    }
源代码网推荐    // 重写ICompositeControlDesignerAccessor接口的RecreateChildContrls方法
源代码网推荐    protected override void RecreateChildControls() {
源代码网推荐     EnsureChildControls();
源代码网推荐    }
源代码网推荐  
源代码网推荐    //重写CreateChildControls方法,将子控件添加到复合控件中
源代码网推荐  
源代码网推荐    protected override void CreateChildControls() {
源代码网推荐     Controls.Clear();
源代码网推荐     _button = new Button();
源代码网推荐     _textBox = new TextBox();
源代码网推荐     _button.ID = "btn";
源代码网推荐     _button.Click += new EventHandler(_button_Click);
源代码网推荐     this.Controls.Add(_button);
源代码网推荐     this.Controls.Add(_textBox);
源代码网推荐    }
源代码网推荐  
源代码网推荐    //重写Render方法,呈现控件中其他的HTML代码
源代码网推荐  
源代码网推荐    protected override void Render(HtmlTextWriter output) {
源代码网推荐     output.AddAttribute(HtmlTextWriterAttribute.Border, "0px");
源代码网推荐     output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "5px");  
源代码网推荐     output.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0px");  
源代码网推荐     output.RenderBeginTag(HtmlTextWriterTag.Table);
源代码网推荐     output.RenderBeginTag(HtmlTextWriterTag.Tr);   
源代码网推荐     output.RenderBeginTag(HtmlTextWriterTag.Td);
源代码网推荐     _textBox.RenderControl(output);
源代码网推荐     output.RenderEndTag();
源代码网推荐     output.RenderBeginTag(HtmlTextWriterTag.Td);
源代码网推荐     _button.RenderControl(output);
源代码网推荐     output.RenderEndTag();
源代码网推荐     output.RenderEndTag();
源代码网推荐     output.RenderEndTag();
源代码网推荐    }
源代码网推荐   }
源代码网推荐  }
源代码网推荐  
源代码网推荐    如上代码所示,复合控件CompositeEvent中包含两个属性:Text和ButtonText。前者用于获取或者设置文本框中的文本内容,后者用于获取或者设置按钮的显示文本。另外,复合控件类中还实现了一个Submit事件。相关重要逻辑包括:
源代码网推荐  
源代码网推荐    第一、在重写CreateChildControls方法中,为子控件Button添加事件处理程序_button_Click。
源代码网推荐  
源代码网推荐    第二、和普通的自定义事件一样,为复合控件定义一个顶层事件Submit。这其中包括定义事件属性结构Submit,定义事件处理程序OnSubmit。
源代码网推荐  
源代码网推荐    第三、实现_button_Click事件处理程序,调用顶层事件Submit的事件处理程序OnSubmit。
源代码网推荐  
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华