博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决使用MasterPage后,Page.FindControl方法找不到指定控件的问题
阅读量:5072 次
发布时间:2019-06-12

本文共 1213 字,大约阅读时间需要 4 分钟。

转自:http://blog.csdn.net/mengkun2010/article/details/2979864

 1. 首先来了解以下FindControl的工作原理:

在ASP.NET 2.0中,引入了MasterPage的机制,在当前页使用MasterPage的情况下,放在 ContentPlaceholder1这样的内容页的控件无法用Page.FindControl来查找,原因何在?

MSDN对FindControl的解释:在当前的命名容器中搜索带指定 id 参数的服务器控件

这里有一篇文章阐述阐述FindControl方法和INamingContainers接口:

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]来作为你要的控件。

转载于:https://www.cnblogs.com/VortexPiggy/archive/2013/03/09/2951765.html

你可能感兴趣的文章
迷途漫漫,终有一归
查看>>
自主开发与带兵打仗
查看>>
三级菜单
查看>>
mysql truncate 的问题
查看>>
切换Oracle数据库实例
查看>>
python 路径操作
查看>>
选项卡
查看>>
Win10系列:VC++调用自定义组件2
查看>>
Qt 的入门小程序
查看>>
Tomcat中配置网站路径
查看>>
Loadrunner 脚本开发-利用web_custom_request函数进行接口测试
查看>>
关联式容器
查看>>
算法训练 Torry的困惑(基本型)
查看>>
SSM框架构建多模块之业务拆分实践
查看>>
lombok问题
查看>>
算法图解之散列表
查看>>
Redis 命令
查看>>
Random获得的随机数怎么样减少重复率
查看>>
C++模板之Vector与STL初探
查看>>
生成器模式(建造者模式)
查看>>