【问题标题】:ASP.NET - Dynamically Accessing ControlsASP.NET - 动态访问控件
【发布时间】: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


【解决方案1】:

假设输入位于某种容器(PlaceHolder、Panel 等)中,您应该可以这样做:

标记:

<asp:PlaceHolder ID="PlaceHolder1" runat="server">
    <asp:TextBox ID="txtISBN1" runat="server" />
    <asp:TextBox ID="txtISBN2" runat="server" />
    ....
    <asp:TextBox ID="txtISBN13" runat="server" />
</asp:PlaceHolder>

代码隐藏:

TextBox txt = PlaceHolder1.Controls.OfType<TextBox>().FirstOrDefault(x => x.ID.ToUpper().Contains("ISBN13"));
if (txt != null)
{
    txt.Text = row.Field<string>("ISBN13");
}

【讨论】:

  • 我的问题是当我需要编辑这个文本框时,我只有一个DataColumn。 ColumnName 将是“ISBN13”,因此,我需要通过执行 String.Format("txt{0}",ColumnName) 来构造 ID。然后,我需要从该 ID 值中获取控件。有意义吗?
  • 您是动态创建控件,还是在标记中声明?
  • 如果在标记中声明了TextBox,您应该可以通过ID直接引用它,即txtISBN13.Text = "foo";
  • James,这个案子没那么简单。有关更多详细信息,请参阅我更新的问题。
  • 好的,你的问题很有误导性。您正在动态创建控件。从您的问题中删除标记。
【解决方案2】:

您的控件在哪个容器中?您需要调用containingControl.FindControl("txtISBN13"),或在Page.Controls - C#, FindControl 中递归搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多