ASP.NET开发人员在使用一些动态导入控件的功能的时候, 常会遇到这样一个问题: 就是明明有这个ControlID, 但使用Page.FindControl(ControlID)得到的结果却是null, 这是bug? 还是某种不明机制?
首先要说的是, 这不是bug. 而为何使用Page.FindControl方法找不到指定控件, 我们可以在该页的页指令中添加 Trace=Ture 指令来跟踪页面输出查看控件树。
其次,得说一下FindControl方法的实现机制,FindControl方法是在当前naming container查找指定ControlID对应的控件,该naming container是一个实现了INamingContainer接口的对象。问题的关键是,Page是指定ControlID的当前naming container么?
一个页面的控件树中,Page对象必然是顶级的naming container,但绝非必然是唯一的naming container。譬如当有GridView存在的话,GridView其实也是一个naming container,要找GridView中的一个ControlID,就不能用Page.FindControl,而得用[GridView对象].FindControl方法。
再譬如最普遍的,在ASP.NET 2.0中,引入了MasterPage的机制,在当前页使用MasterPage的情况下,当前页也产生了类似ContentPlaceholder1这样的naming container,这时查找当前页的控件,也不能使用Page.FindControl方法,而得要用ContentPlaceholder1.FindControl方法。
很多时候,因为是动态控件,明知道是在同一个naming container中,但不知道该naming container是什么对象,一个控件要找到另一个控件,可以用this.Parent.FindControl方法。
至此问题解决,祝新年快乐!
分享到:
相关推荐
// 输出True,表示没有找到控件 Response.Write(spnButtons.FindControl(btn.ID) == null); 而如果是下面的代码就可以了: 代码如下:Panel spnButtons = new Panel(); Page.Controls.Add(spnButtons);// 创建Panel...
在服务器端代码中,首先通过`Page.Master.FindControl("head")`找到名为`head`的内容占位符,再通过`FindControl("btn_add")`方法查找名为`btn_add`的控件。如果找到的控件不为空,并且其类型为`System.Web.UI....
本实例将深入讲解`Repeater`控件的使用方法,包括其基本概念、结构、绑定数据以及如何自定义模板。 1. 基本概念: `Repeater`控件是一种动态数据呈现控件,它通过使用模板来生成HTML输出。这些模板可以包含任何ASP...
用户控件与父页面及相互间方法调用和属性访问 用户控件开发中,实现控件与父页面...哈哈,我们能方法都能获得难道值还拿不到?再者途径很多,这里就不多嘴了:) * 注意:被调用父页或其他用户控件的方法必须是 public!
- 使用`FindControl`方法找到动态生成的控件,然后使用`AddHandler`方法附加事件处理程序,如`Button1_Click`。 3. **数据绑定和动态控件**: - 如果动态添加的控件需要与数据源绑定,例如在循环中生成多个...
### ASP.NET `Page.Controls` 对象详解 ...需要注意的是,对于复杂的控件层次结构,可能还需要使用`Control.FindControl`等方法来访问深层的子控件。此外,理解控件的生命周期对于正确地操作这些控件也是非常关键的。
1. **FindControl** 方法:这是最基础的方法,通过递归遍历页面控件树来查找指定的控件。首先从子页面开始,然后向上遍历到父级母版页,直到找到目标控件。例如: ```csharp protected void Page_Load(object ...
这里的`Page.LoadControl`方法用于从指定路径加载用户控件,并将其转换为`UserControl`对象,然后添加到页面的某个容器控件(如`PlaceHolder`)中。 然而,动态加载用户控件可能会导致控件的状态丢失,因为默认情况...
2. 数据绑定语法:使用`DataSourceID`属性绑定到数据源控件,或者在代码后面使用`DataBind()`方法动态绑定数据。 3. 显示模板:`DataList`有几种内置模板,如`ItemTemplate`(用于定义每个数据项的外观)、`...
3. **步骤三:** 使用jQuery的Ajax方法发送异步请求到服务器,获取控件的数据。在客户端JavaScript中,你可以这样编写: ```javascript $.ajax({ url: 'GetControlData.aspx', type: 'POST', data: { controlId:...
- 在C#代码隐藏文件中,可以通过`FindControl`方法找到`Panel`控件,例如:`Panel myPanel = (Panel)Page.FindControl("myPanel");` - 设置`Panel`的可见性:`myPanel.Visible = true/false;` - 添加动态内容:`...
这是因为ASP.NET Web Forms在每次HTTP请求时都会重新创建控件树,动态生成的控件在页面生命周期的早期阶段并不存在,因此在Button2的Click事件中找不到该控件。 为了解决这个问题,我们需要确保在每个请求中都重新...
然而,很多ASP.NET初学者在尝试动态创建控件时遇到了困难,比如动态创建的控件无法正确加载ViewState数据、控件事件处理不正常等问题。本文将通过一个具体的示例,详细讲解如何在Web Forms中动态创建TextBox和Button...
本文将深入探讨几种在ASP.NET中动态指定页面样式表的方法,包括但不限于通过服务器端控件、数据库集成以及动态加载技术。 #### 方法一:利用服务器端控件动态更改样式表 这种方法的核心在于将HTML元素转化为服务器...
这里的`LoadControl`方法用于从指定的路径加载用户控件,并返回一个实例。 - **保存视图状态**:由于动态加载的控件不会自动保存其视图状态,所以需要手动处理。在`Page_Load`事件中,检查`IsPostBack`属性,如果是...
在ASP.NET 2.0中,`PostBackUrl`属性被添加到`Button`控件中,使得按钮点击后可以跳转到指定的页面,同时将当前页面的状态和控件值传递过去。这意味着,当用户点击带有`PostBackUrl`属性的按钮时,不是执行页面的`...
`FindControl`方法会递归查找指定ID的控件。确保`GridViewID`是GridView在设计时的服务器端ID。 ### JavaScript 在客户端使用JavaScript获取GridView ID,我们需要知道GridView对应的HTML元素ID。ASP.NET通常会将...
例如,你可以创建一个自定义CSS类,然后在后台代码中动态地将其添加到控件的`CssClass`属性上: ```csharp // 定义CSS类 public static string MyCustomStyle = "myCustomStyle { position: absolute; top: 50px; ...
在本篇文章中,我们将深入探讨GridView控件的使用,以及如何实现其基本功能。 首先,GridView控件的配置通常在`.aspx`页面中进行。例如,在`Default.aspx`文件中,你可以看到如下的HTML标记: ```html <!-- 这里...