继承的用户控件的 ASP.NET 事件生命周期
-
22-09-2019 - |
题
请原谅伪代码,但这是一个简单的问题:
我创建一个用户控件(myControlBase :UserControl),其标记中有一个文本框(id =“txtbox”)。在它的代码隐藏中,我编写了一个方法 SayHello(string s){ txtbox.Text = s;}。
我创建另一个扩展 myControlBase 的用户控件(myControl :我的控制库)。在这个子控件的page_load中,我调用SayHello(“hello”);并收到一个运行时错误,告诉我 txtbox 为空(显然尚未创建)。
那么,我如何从用户控件继承并让我的子控件访问基本控件的标记呢?我试图阅读这些控件的事件生命周期,但我想我没有明白。
有任何想法吗?
-编辑-
抱歉,这是 ASP.Net。如果这段代码让它变得更清晰,那么我在描述这个问题方面一定做得很糟糕。
txtBox 是一个 ASP:Textbox 控件,存在于 myControlBase 的标记中。
public partial class myControlBase : System.Web.UI.UserControl
{
protected void SayHello(string s){
txtBox.Text = s;
}
}
public partial class myControl: myControlBase
{
protected void Page_Load(object sender, EventArgs e)
{
SayHello("hello");
}
}
这会在 SayHello("hello"); 处失败因为 txtBox 返回 Null。
解决方案
我现在明白了这个问题,但我没有一个很好的解决方案。
在延长这样的用户控制,则完全失去访问基控件的标记。孩子的的Page_Load之前被调用(可能代替?)的基本控制的Page_Load中。
其他提示
除了像这样的方法 Page_Load
, ,有 On*
方法,比如 OnInit
和 OnLoad
. 。这些是虚拟方法,因此可以由派生的用户控件覆盖。
public override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SayHello("hello");
}
它看起来像的CreateChildControls没有被调用呢。
尝试添加EnsureChildControls()中的Page_Load,或从OnPreRender事件调用的SayHello。