我正在以编程方式在我的表单上创建一些文本框,稍后我需要使用FindControl来引用它。
我在创建它们的代码之后将FindControl指令放在页面加载方法中但得到错误:
对象引用未设置为对象的实例。
我认为这是因为文本框控件直到生命周期的后期才创建,因此无法从Page_Load中引用。
有人可以建议我的代码隐藏在哪里,我需要放置FindControl指令,以便它可以找到这些以编程方式创建的文本框?
答案 0 :(得分:3)
您是否将文本框控件放在另一个控件(如面板或网格)中?如果是这样,您需要递归搜索页面上的所有控件。
以下是递归FindControl实现的示例:Recursive Page.FindControl。您可以通过Google搜索“recursive findcontrol”找到许多其他示例。
答案 1 :(得分:2)
如果以编程方式创建文本框,则可以直接使用它来操作它们。不需要FindControl(也会更慢)
TextBox txt = new TextBox();
...
txt.Text = "Text";
如果您需要使用不同的方法进行访问,则可以将txt设为该类的私有变量。
如果你真的需要使用FindControl - 当你调用这个函数时,是否在页面中添加了文本框(添加到页面的Controls列表中)?
答案 2 :(得分:1)
在页面加载时,控件应全部设置好并准备好使用。初始化控制并在启动阶段(在加载阶段之前)进行初始化。
我建议你检查代码,找到控件开始 - 例如,如果控件嵌套在其他控件中,你需要递归搜索或从正确的容器控件中搜索。
答案 3 :(得分:1)
如果您要在CreateChildControls中添加文本框,则可能必须在访问之前调用EnsureChildControls。
答案 4 :(得分:1)
刚刚从Steele Price的blog post发现了这个功能,它完美无缺。我试图在具有母版页的页面中引用用户控件,除此之外我没有尝试过任何工作。把它放在你的一个核心课程中。请阅读Steele's blog post了解详情。
如果你把它放在一个类中,你需要获得控件参考,如:
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;
}
答案 5 :(得分:0)
如果你在OnInit覆盖期间(在我相信调用base.OnInit(e)之前)创建TextBox控件,它们将在Page.OnLoad和任何相关事件期间可用。您还可以将它们放入ViewState对象图中的正确位置,这对于处理回发,特别是服务器端验证非常有用。