《纵向切入ASP.NET 3.5控件和组件开发技术》笔记…
2018-06-17 20:23:04来源:未知 阅读 ()
在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public event EventHandler TextChanged;
protected virtual void OnTextChanged(EventArgs e)
{
if (TextChanged != null)
{
TextChanged(this, e);
}
}
在复合控件中,事件一般比较多,如果仍然基于以上普通事件的实现方法来定义事件,就会定义许多事件委托实现对象,导致占用较多内存存储。
在这种情况下,则应该通过System.ComponentModel.EventHandlerList集合类来保存事件,原因是使用此类在多个事件的声明过程中比普通的实现方法效率高。EventHandlerList类提供一个简单的委托列表来添加(Events.AddHandler)和删除(Events.RemoveHandler)委托,在Control基类中已经定义好了EventHandlerList类型的对象Events,因此可以直接通过base.Events访问事件列表对象。
下面利用Events集合对象存储事件,修改一下KingTextBox控件的事件声明/调用部分,为了保留KingTextBox现有功能,新增一个控件示例,控件名称为KingTextBoxUseEvents。事件部分的代码为:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
private static readonly object TextChangedKeyObject = new object();
public event EventHandler TextChanged
{
add
{
base.Events.AddHandler(KingTextBoxUseEvents.TextChangedKeyObject, value);
}
remove
{
base.Events.RemoveHandler(KingTextBoxUseEvents.TextChangedKeyObject,
value);
}
}
protected virtual void OnTextChanged(EventArgs e)
{
EventHandler handler = base.Events[KingTextBoxUseEvents.TextChanged
KeyObject] as EventHandler;
if (handler != null)
{
handler(this, e);
}
}
以上代码首先定义了一个Object对象TextChangedKeyObject,用于当存储事件到Events列表时,作为TextChanged事件的Key,其对应Value为即为事件方法体。接下来定义了一个事件委托类型的TextChanged属性,其内容包括一个add和一个remove子句,在这两个子句中分别完成注册和释放事件功能。最后的OnTextChanged方法也稍微变了一下,增加了从base.Events事件列表中根据TextChangedKeyObject键得到事件句柄的代码语句,如果取得的句柄handler不为null,即可引发开发人员注册的事件。
控件KingTextBoxUseEvents代码也比较简单,下面也把它的完整代码展示出来:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
[DefaultProperty("Text")]
[ToolboxData("<{0}:KingTextBoxUseEvents runat=server></{0}:KingTextBoxUseEvents>")]
public class KingTextBoxUseEvents : Control, IPostBackDataHandler
{
public KingTextBoxUseEvents()
{
}
/// <summary>
/// 设置或获取显示文本
/// </summary>
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Text"] = value;
}
}
/// <summary>
/// 生成呈现HTML格式标记
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
sb.Append("<input type=/"text/" name=");
sb.Append("/"" + UniqueID + "/"");
sb.Append(" value=");
sb.Append("/"" + HttpUtility.HtmlEncode(Text) + "/"");
sb.Append(" />");
writer.Write(sb.ToString());
}
public virtual bool LoadPostData(string postDataKey, NameValueCollection
postCollection)
{
string strOldValue = Text;
string strNewValue = postCollection[this.UniqueID];
if( strOldValue == null || ( strOldValue != null && !strOldValue.Equals
(strNewValue)))
{
this.Text = strNewValue;
return true;
}
return false;
}
public virtual void RaisePostDataChangedEvent()
{
OnTextChanged(EventArgs.Empty);
}
//高效事件
private static readonly object TextChangedKeyObject = new object();
public event EventHandler TextChanged
{
add
{
base.Events.AddHandler(KingTextBoxUseEvents.TextChangedKeyObject, value);
}
remove
{
base.Events.RemoveHandler(KingTextBoxUseEvents.TextChanged
KeyObject, value);
}
}
protected virtual void OnTextChanged(EventArgs e)
{
EventHandler handler =base.Events[KingTextBoxUseEvents.TextChanged KeyObject] as EventHandler;
if (handler != null)
{
handler(this, e);
}
}
}
KingTextBoxUseEvents控件与KingTextBox功能完全相同,应用方法也相同。另外,事件的委托和参数对象也可以自定义,下一节就讲一下如何定制自己的委托和事件对象。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:前缀方式增1和后缀方式增1的区别
下一篇:【C#】委托
- 0005-20180422-自动化第六章-python基础学习笔记 2018-09-18
- [笔记] FMX 移动平台 TWebBrowser 问题 2018-09-05
- SqlBulkCopy高效能批量插入SQL SERVER 2018-06-21
- 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lamb 2018-06-21
- Webservice服务创建、调用笔记 2018-06-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash