我正在以编程方式在表单上创建一些文本框,稍后我需要使用 FindControl 引用这些文本框。
我在创建它们的代码之后将 FindControl 指令放在页面加载方法中,但出现错误:
你调用的对象是空的。
我认为这是因为文本框控件直到生命周期的后期才创建,因此无法从 Page_Load 中引用。
有人可以建议我需要在我的代码隐藏中放置 FindControl 指令的位置,以便它可以找到这些以编程方式创建的文本框吗?
您是否将文本框控件放在另一个控件(例如面板或网格)中?如果是这样,您需要递归搜索页面上的所有控件。
这是递归 FindControl 实现的示例:Recursive Page.FindControl。您可以通过谷歌搜索“recursive findcontrol”找到许多其他示例。
如果您以编程方式创建文本框,则可以直接使用它来操作它们。不需要 FindControl(也会更慢)
TextBox txt = new TextBox();
...
txt.Text = "Text";
如果您需要以不同的方法访问,您可以将 txt 设置为该类的私有变量。
如果您确实需要使用 FindControl - 调用函数时是否在页面中添加了文本框(添加到页面的控件列表中)?
在页面加载时,所有控件都应该设置好并准备好使用。控件在加载阶段之前的初始化阶段被初始化。
我建议您检查查找控件的代码,例如,如果控件嵌套在其他控件中,则需要递归搜索或从正确的容器控件中搜索。
如果您在 CreateChildControls 中添加文本框,您可能必须在访问它们之前调用 EnsureChildControls。
刚刚从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;
}
如果您在 OnInit 覆盖期间制作 TextBox 控件(我相信在调用 base.OnInit(e) 之前),它们将在 Page.OnLoad 和任何相关事件期间可用。您还可以将它们放入 ViewState 对象图中的正确位置,这对于处理回发特别是服务器端验证非常有用。