【发布时间】:2011-10-21 17:18:37
【问题描述】:
我的 ASPX 页面上有以下控件:
<asp:TextBox ID="txtISBN13" runat="server" ClientIDMode="Static" />
我需要在不明确引用的情况下访问该元素。因为在 Page_Load 事件期间这个控件还不存在,所以我必须在页面生命周期的后期访问它。
我已尝试覆盖 OnUnload 事件,因为这是最后一个事件,但我仍然无法通过以下方式访问我的控件:
Control c = new Control();
c.FindControl("txtISBN13");
或者:
Control c = Page.FindControl("txtISBN13");
我是否覆盖了不正确的事件? ClientIDMode 是在惹我生气吗?即使我在按钮单击事件上尝试类似的代码,我也没有运气。我需要某种递归 FindControl 吗?我应该使用 Page.FindControl 还是 Control.FindControl?
对于这种情况,我无能为力:
this.txtISBN13.Text = "Foo";
相反,我将有一个 DataColumn (previousValue),我需要找到该控件并设置它的值。我正在尝试:
string pendingID = String.Format("txt{0}", previousValue.ColumnName);
TextBox txt = new TextBox();
txt.ID = pendingID;
txt.Text = "Foo";
【问题讨论】:
-
文本框的容器是什么?它在中继器、用户控件、gridview 等中吗?如果它直接在网络表单上并且不包含在其他东西中,它应该可以直接访问。
-
控件没有嵌套,只是在窗体上。
-
好的。也许我错过了一些东西。现在看起来您正在将控件动态添加到页面,您实际上并没有表单上问题顶部的标记。这不是一个微不足道的细节。
-
控件存在,但我想从 DataColumn 动态获取它,该 DataColumn 的 ColumnName 等于文本框 ID(或多或少)。我现在正在尝试遍历 Page.Controls 集合,但更糟糕的是,我使用的是母版页。
-
好的。我想我明白你在问什么。关于实际问题,我目前没有完整的答案。但是对于这个事件,我会说如果你需要 after Load,使用 PreRender。在 Unload 触发时,您无法影响发送给用户的内容。尝试使用 PreRender,执行
TextBox tb = (TextBox)this.FindControl("theConstructedTextboxName"); tb.Text = "Foo";并查看它的作用。
标签: c# asp.net page-lifecycle