解决Page.FindControl方法找不到指定控件 转
2011-06-28 14:53
525 查看
上一篇用户控件之间事件调用方法里用到了Page.FindControl方法, 结果里面的例子是可以的, 我用到了网站里就出错了, 出现了"未将对象引用设置到对象的实例", 一般是对象没有初始化, 下面是解决办法
转自http://blog.csdn.net/mengkun2010
"
1. 首先来了解以下FindControl的工作原理:
在ASP.NET 2.0中,引入了MasterPage的机制,在当前页使用MasterPage的情况下,放在 ContentPlaceholder1这样的内容页的控件无法用Page.FindControl来查找,原因何在?
MSDN对FindControl的解释:在当前的命名容器中搜索带指定 id 参数的服务器控件
这里有一篇文章阐述阐述FindControl方法和INamingContainers接口:http://www.odetocode.com/Articles/116.aspx
FindControl方法是在当前naming container查找指定ControlID对应的控件,该naming container是一个实现了INamingContainer接口的对象。
可以在该页的页指令中添加 Trace=Ture 指令来跟踪页面输出查看控件树。一个页面的控件树中,Page对象必然是顶级的naming container,但绝非必然是唯一的naming container。譬如当有GridView存在的话,GridView其实也是一个naming container,要找GridView中的一个ControlID,就不能用Page.FindControl,而得用[GridView对象].FindControl方法。
很多时候,因为是动态控件,明知道是在同一个naming container中,但不知道该naming container是什么对象,一个控件要找到另一个控件,可以用this.Parent.FindControl方法。
2. 解决问题:
因为使用MasterPage后,你再用Page.FindControl不可能找到的,这没什么疑问,因此正确的方法是你先找到此控件的naming container,这里也就是ContentPlaceHolder#的ID,然后在去找你的控件,比如:Page.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1")。
3. 深度分析:
显然在第二步里面我们给问题解决了,但是仔细分析,不难发现这个解决方案本身存在着另外一个问题,即:如果ContentPlaceHolder1这个ID改变了,那么你的CODE就不能用了,也要改变。
一个跟更好的解决方法是:
TextBox[] tbx = new TextBox[] { this.TextBox1,this.TextBox2......}
然后使用tbx[index]来作为你要的控件。
"
以及csdn里的一篇帖子http://topic.csdn.net/u/20100820/14/836ebf37-3989-4868-98c5-1795de7f5c73.html
"
"
孟爷怒了..
我的网站里用了一个母版页, 所以我的应该这样写, 顺着元素名一步一步找到
BJshitishu tname = Page.Master.FindControl("MainContent").FindControl("BJshitishu1") as BJshitishu;
转自http://blog.csdn.net/mengkun2010
"
1. 首先来了解以下FindControl的工作原理:
在ASP.NET 2.0中,引入了MasterPage的机制,在当前页使用MasterPage的情况下,放在 ContentPlaceholder1这样的内容页的控件无法用Page.FindControl来查找,原因何在?
MSDN对FindControl的解释:在当前的命名容器中搜索带指定 id 参数的服务器控件
这里有一篇文章阐述阐述FindControl方法和INamingContainers接口:http://www.odetocode.com/Articles/116.aspx
FindControl方法是在当前naming container查找指定ControlID对应的控件,该naming container是一个实现了INamingContainer接口的对象。
可以在该页的页指令中添加 Trace=Ture 指令来跟踪页面输出查看控件树。一个页面的控件树中,Page对象必然是顶级的naming container,但绝非必然是唯一的naming container。譬如当有GridView存在的话,GridView其实也是一个naming container,要找GridView中的一个ControlID,就不能用Page.FindControl,而得用[GridView对象].FindControl方法。
很多时候,因为是动态控件,明知道是在同一个naming container中,但不知道该naming container是什么对象,一个控件要找到另一个控件,可以用this.Parent.FindControl方法。
2. 解决问题:
因为使用MasterPage后,你再用Page.FindControl不可能找到的,这没什么疑问,因此正确的方法是你先找到此控件的naming container,这里也就是ContentPlaceHolder#的ID,然后在去找你的控件,比如:Page.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1")。
3. 深度分析:
显然在第二步里面我们给问题解决了,但是仔细分析,不难发现这个解决方案本身存在着另外一个问题,即:如果ContentPlaceHolder1这个ID改变了,那么你的CODE就不能用了,也要改变。
一个跟更好的解决方法是:
TextBox[] tbx = new TextBox[] { this.TextBox1,this.TextBox2......}
然后使用tbx[index]来作为你要的控件。
"
以及csdn里的一篇帖子http://topic.csdn.net/u/20100820/14/836ebf37-3989-4868-98c5-1795de7f5c73.html
"
![]() gongshunkai (gongshunkai) 等 级: ![]() 结帖率:100.00% | 楼主发表于:2010-08-20 14:31:18
|
![]() net_lover (【孟子E章】) 等 级: ![]() 3 3 更多勋章 | #1楼 得分:0回复于:2010-08-20 14:42:39
| ||
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:数据库类的扩展:数据库的建立和表的建立 |
![]() wuyq11 (人生如梦) 等 级: ![]() 2 20 3 更多勋章 | #2楼 得分:0回复于:2010-08-20 14:58:58
|
![]() net_lover (【孟子E章】) 等 级: ![]() 3 3 更多勋章 | #13楼 得分:0回复于:2010-08-20 20:47:29
| ||
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP |
![]() net_lover (【孟子E章】) 等 级: ![]() 3 3 更多勋章 | #14楼 得分:0回复于:2010-08-20 20:52:10
|
孟爷怒了..
我的网站里用了一个母版页, 所以我的应该这样写, 顺着元素名一步一步找到
BJshitishu tname = Page.Master.FindControl("MainContent").FindControl("BJshitishu1") as BJshitishu;
相关文章推荐
- 解决使用MasterPage后,Page.FindControl方法找不到指定控件的问题
- 解决使用MasterPage后,Page.FindControl方法找不到指定控件的问题
- 解决使用MasterPage后,Page.FindControl方法找不到指定控件的问题
- [网络收集]解决在母版页中使用Page.FindControl方法找不到指定控件的问题
- 解决Page.FindControl方法找不到指定控件 转
- FormView里用FindControl找不到控件的解决方法
- GridView中使用类似于Button btnToped = (Button)e.Row.FindControl("btnToped");提示“未将对象引用到实例”,也就是找不到控件的问题的解决方法
- Page.FindControl方法找不到指定控件的原因
- Page.FindControl方法找不到指定控件的原因
- Page.FindControl方法找不到指定控件的原因
- PreviousPage.FindControl遇到MasterPage查找控件的方法
- Page.FindControl找不到控件
- 用ActiveX Control Test Container测试ActiveX控件时找不到控件的解决方法
- PreviousPage.FindControl遇到MasterPage查找控件的方法
- 有关pagecontrol控件的各种使用方法
- FindControl 找控件,方法总结
- 未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件,解决方法
- 未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件,解决方法
- 在WIN10系统下运行VS2013编译成功后出现:无法启动程序“.exe” 系统找不到指定文件的问题的解决方法
- 开机找不到指定模块及***.dll文件的解决方法