【原创】ASP.NET自定义控件开发点滴(二)

 出处:http://blog.csdn.net/caoxicao
 作者:草惜草
 转载请注明出处

HtmlTextWriter

HtmlTextWriter的各种方法的参数取值为以下三种枚举类型:HtmlTextWriterTag,HtmlTextWriterAttribute和HtmlTextWriterStyle。这些枚举列举了HTML4.0的公共签名、attribute和CSS样式attribute。HtmlTextWriter中的很多方法都被重载,可以将字符串或者枚举值作为一个参数传送过去。

-----------------------------------------
委托和事件
我一直深受C#中委托和事件的影响,认为委托就是Delegate,事件是Event.哈哈,原来ASP.NET
中EventHandler就是所谓的委托。狂晕!

.NET Framework 中的事件模型基于具有事件委托,该委托将事件与事件处理程序连接。引发事件需要两个元素:
保存事件数据的类。该类必须从基类 EventArgs 派生。
指向方法的委托,该方法提供对事件的响应。
如果事件不生成数据,则使用事件数据对象的基类 EventArgs 和事件委托的预定义 EventHandler。

如: public delegate void EventHandler(Object sender, EventArgs e);

 这是一个对不包含数据事件委托的声明,其中 EventHandler 是预定义的事件委托,sender 是引发事件的对象,而 e 是不包含数据的事件数据对象,EventArgs 是包含事件数据的类的基类。

----------------------------------------------

复合控件

EnsureChildControls() 方法是确认当前控件存在子控件。如果没有就新建一个。
复合控件可选择是否将子控件公开为属性,以及将子控件的哪些属性和事件公开为顶级属性和事件。
如下所示就是将button子控件的Text属性公开为ButtonText属性。

        public string ButtonText {
            get {
                EnsureChildControls();
                return _button.Text;
            }
            set {
                EnsureChildControls();
                _button.Text = value;
            }
        }

-----------------------------------------
关于事件优化 

C#提供了“属性样式的事件声明”
基本格式为:
        public event [委托类型] [事件名称]
        {
            add { .... }
            remove { .... }
        }

利用这个被称为“事件模型”的东西来建立事件委托。Control类为每个事件定义了一个,用于EventHandler中存储和取回事件委托。
例如下面的代码显示了Logon事件的。  
   
private static readonly object EventLogon = new object();

是静态的(在控件的所有实例间共享),因此仅为每个事件创建一次。下面的代码显示了C#事件的属性模型,这是一个Logon事件的声明。

        public event EventHandler Logon {
            add {
                Events.AddHandler(EventLogon, value);
            }
            remove {
                Events.RemoveHandler(EventLogon, value);
            }
        }
最后看看On<EventName>(处理事件)方法的实现。这种方法主要用来引发事件。当用事件的属性模型时,必须从EventHanderList中取回委托,然后在调用附加的处理程序前,将其转变成事件委托类型。

 
       protected virtual void OnLogon(EventArgs e) {
            EventHandler logonHandler = (EventHandler)Events[EventLogon];
            if (logonHandler != null) {
                logonHandler(this, e);
            } 
        }

注:这里logonHandler已经是委托类型的实例,故而logon
注:System.ComponentModel.EventHandlerList 提供一个简单的委托列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值