快速业务通道

Asp.net 3.5控件和组件开发技术系列—从零开始开发服务器控件(下)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
端时用下画线作分隔符,但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如下所示:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public override Control FindControl(string id)
{
   Control found = base.FindControl(id);

   if (found == null)
   {
     found = this.Page.FindControl(id);
   }

   if (found == null)
   {
     found = FindControlExtend(id, this.Controls);
   }

   if (found == null)
   {
     found = FindControlExtend(id, this.Page.Controls);
   }
   return found;
}

private Control FindControlExtend(string id, ControlCollection controls)
{
   int i;
   Control Found = null;

   for (i = 0; i < controls.Count; i++)
   {
     if (controls[i].ID == id)
     {
       Found = controls[i];
       break;
     }

     if (controls[i].Controls.Count > 0)
     {
       Found = FindControlExtend(id, controls[i].Controls);
       if (Found != null) break;
     }
   }
   return (Found);
}

以上代码共有两个方法,方法FindControlExtend主要实现递归遍历当前控件的所有子控件功能 ,方法 FindControl通过关键字override重写了基类中的FindControl方法。这样只要我们把上面 两个方法放置控件代码中,还是按之前的调用格式:this.FindControl(id)使用即可。

下面说明一下FindControl方法体功能。为了提高效率,重写的 FindControl方法体中首先还是 从当前和Page命名容器中检索是否能够找到我们指定的控件,如果找到则不再执行后面的递归遍历 ,直接返回控件;否则要递归遍历当前控件的所有子控件和当前页面Page控件的所有子控件(如果 使用了母版页MasterPage控件,Master控件会在 Page.Controls集合中检索到)。如果最后执行完 所有的遍历仍然找不到指定ID的控件,则说明指定ID控件在页面容器中根本不存在,则返回 null ,检索结束。

总结一下,FindControl方法

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号