请原谅伪代码,但这是一个简单的问题:

我创建一个用户控件(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* 方法,比如 OnInitOnLoad. 。这些是虚拟方法,因此可以由派生的用户控件覆盖。

public override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    SayHello("hello");
}

它看起来像的CreateChildControls没有被调用呢。

尝试添加EnsureChildControls()中的Page_Load,或从OnPreRender事件调用的SayHello。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top