1

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

我创建了一个用户控件(myControlBase:UserControl),其标记中有一个文本框(id =“txtbox”)。在它的代码隐藏中,我编写了一个方法 SayHello(string s){ txtbox.Text = s; }。

我创建了另一个扩展 myControlBase (myControl : myControlBase) 的用户控件。在这个子控件的 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。

4

3 回答 3

2

我现在明白了这个问题,但我没有一个好的解决方案。

当您像这样扩展用户控件时,您将完全无法访问基本控件的标记。子控件的 Page_Load 在(可能而不是?)基本控件的 Page_Load 之前调用。

于 2010-03-01T21:02:22.223 回答
1

除了方法 like 之外Page_Load,还有On*方法 likeOnInitOnLoad。这些是虚拟方法,因此可以被派生的用户控件覆盖。

public override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    SayHello("hello");
}
于 2010-03-01T21:32:52.490 回答
0

看起来尚未调用 CreateChildControls。

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

于 2010-02-26T00:52:57.790 回答