2

我正在以编程方式在表单上创建一些文本框,稍后我需要使用 FindControl 引用这些文本框。

我在创建它们的代码之后将 FindControl 指令放在页面加载方法中,但出现错误:

你调用的对象是空的。

我认为这是因为文本框控件直到生命周期的后期才创建,因此无法从 Page_Load 中引用。

有人可以建议我需要在我的代码隐藏中放置 FindControl 指令的位置,以便它可以找到这些以编程方式创建的文本框吗?

4

6 回答 6

3

您是否将文本框控件放在另一个控件(例如面板或网格)中?如果是这样,您需要递归搜索页面上的所有控件。

这是递归 FindControl 实现的示例:Recursive Page.FindControl。您可以通过谷歌搜索“recursive findcontrol”找到许多其他示例。

于 2008-10-10T16:34:08.820 回答
2

如果您以编程方式创建文本框,则可以直接使用它来操作它们。不需要 FindControl(也会更慢)

TextBox txt = new TextBox();
...
txt.Text = "Text";

如果您需要以不同的方法访问,您可以将 txt 设置为该类的私有变量。

如果您确实需要使用 FindControl - 调用函数时是否在页面中添加了文本框(添加到页面的控件列表中)?

于 2008-10-10T09:20:55.743 回答
1

在页面加载时,所有控件都应该设置好并准备好使用。控件在加载阶段之前的初始化阶段被初始化。

我建议您检查查找控件的代码,例如,如果控件嵌套在其他控件中,则需要递归搜索或从正确的容器控件中搜索。

于 2008-10-10T11:06:13.190 回答
1

如果您在 CreateChildControls 中添加文本框,您可能必须在访问它们之前调用 EnsureChildControls。

于 2008-10-10T11:06:44.047 回答
1

刚刚从Steele Price的博客文章中发现了这个功能,它运行良好。我试图在具有母版页的页面内引用用户控件,除此之外我没有尝试过任何工作。把它放在你的核心课程之一。阅读斯蒂尔的博​​文了解更多详情。

如果你把它放在一个类中,你将需要获取控件引用,例如:

Dim imgStep2PreviewIcon As Image = Eyespike.Utilities.FindControl(Of Control)(Page, "imgStep1PreviewIcon")
imgStep2PreviewIcon.Visible = False

VB.NET 代码

Public Shadows Function FindControl(ByVal id As String) As Control
    Return FindControl(Of Control)(Page, id)
End Function

Public Shared Shadows Function FindControl(Of T As Control)(ByVal startingControl As Control, ByVal id As String) As T
    Dim found As Control = startingControl
    If (String.IsNullOrEmpty(id) OrElse (found Is Nothing)) Then Return CType(Nothing, T)
    If String.Compare(id, found.ID) = 0 Then Return found
    For Each ctl As Control In startingControl.Controls
        found = FindControl(Of Control)(ctl, id)
        If (found IsNot Nothing) Then Return found
    Next
    Return CType(Nothing, T)
End Function

C# (未经测试,使用converter.telerik.com生成)

public new Control FindControl(string id)
{
    return FindControl<Control>(Page, id);
}

public static new T FindControl<T>(Control startingControl, string id) where T : Control
{
    Control found = startingControl;
    if ((string.IsNullOrEmpty(id) || (found == null))) return (T)null; 
    if (string.Compare(id, found.ID) == 0) return found; 
    foreach (Control ctl in startingControl.Controls) {
        found = FindControl<Control>(ctl, id);
        if ((found != null)) return found; 
    }
    return (T)null;
}
于 2008-10-26T06:28:21.023 回答
0

如果您在 OnInit 覆盖期间制作 TextBox 控件(我相信在调用 base.OnInit(e) 之前),它们将在 Page.OnLoad 和任何相关事件期间可用。您还可以将它们放入 ViewState 对象图中的正确位置,这对于处理回发特别是服务器端验证非常有用。

于 2008-10-10T11:01:03.590 回答