Asp.net 3.5控件和组件开发技术系列—从零开始开发服务器控件(下)
端时用下画线作分隔符,但name属性还是以"&"字符作为分隔符。
当控件被设置的ID字符中包括"&"符号,编译控件时就会报错,因为"&"是由于控件实 现了InamingContainer而由系统自动增加的嵌套控件分隔符。这里要说明的是,在Render方法中使 用直接输出HTML标签时对控件ID设置时要注意,如果在这个方法中设置的ID不符合规范,则呈现到 页面后的HTML也是不符合规范的。下面是一个正确设置ID和Name属性的例子: writer.AddAttribute("id", this.ClientID) ; writer.AddAttribute("name", this.UniqueID) ; 设置name属性为UniqueID,在处理回发数据事件时页框架还会根据该属性检索发送的内容,进 而确定是否执行控件的LoadPostData方法,关于数据回发机制在第5章会做专门讲解。这样,在客 户端通过name属性也能够取得控件在服务端的ID。ASP.NET所有基本控件的规范都是这么做的。 3.8.5 增强FindControl功能 在控件中直接使用Control基类的 this.FindControl(id) 方法仅会从当前命名窗口中检索指定 ID的控件。但有些时候我们需要从Page中检索另一个控件,或者从Page的Controls中,比如 MasterPage中检索控件,获取控件的引用。笔者在实际开发中经常在页面设计中建立两个控件之间 的关联,则仅使用Control基类中的 FindControl(id)方法是不够的。为了实现从Page中检索另一 个控件,同时考虑执行效率,在基类的方法上扩展后的FindControl如下所示:
以上代码共有两个方法,方法FindControlExtend主要实现递归遍历当前控件的所有子控件功能 ,方法 FindControl通过关键字override重写了基类中的FindControl方法。这样只要我们把上面 两个方法放置控件代码中,还是按之前的调用格式:this.FindControl(id)使用即可。 下面说明一下FindControl方法体功能。为了提高效率,重写的 FindControl方法体中首先还是 从当前和Page命名容器中检索是否能够找到我们指定的控件,如果找到则不再执行后面的递归遍历 ,直接返回控件;否则要递归遍历当前控件的所有子控件和当前页面Page控件的所有子控件(如果 使用了母版页MasterPage控件,Master控件会在 Page.Controls集合中检索到)。如果最后执行完 所有的遍历仍然找不到指定ID的控件,则说明指定ID控件在页面容器中根本不存在,则返回 null ,检索结束。 总结一下,FindControl方法 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |