1

疑似コードを許してください、しかしそれは簡単な質問です:

マークアップにテキスト ボックス (id = "txtbox") を含むユーザー コントロール (myControlBase : UserControl) を作成します。その分離コードで、メソッド SayHello(string s){ txtbox.Text = s; を記述します。}。

myControlBase (myControl : myControlBase) を拡張する別のユーザー コントロールを作成します。この子コントロールの page_load で、SayHello("hello"); を呼び出します。txtbox が null であることを知らせる実行時エラーを受け取ります (明らかにまだ作成されていません)。

では、ユーザー コントロールから継承し、子コントロールがベース コントロールのマークアップにアクセスできるようにするにはどうすればよいでしょうか。これらのコントロールのイベント ライフサイクルについて調べてみましたが、理解できていないようです。

何か案は?

-編集-

すみません、ASP.Netです。このコードでより明確になったとしたら、問題の説明がかなり不十分だったに違いありません。

txtBox は、myControlBase のマークアップに存在する ASP:Textbox コントロールです。

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

のようなメソッドに加えて、 や のようなメソッドがPage_Loadあります。これらは仮想メソッドであるため、派生したユーザー コントロールによってオーバーライドできます。On*OnInitOnLoad

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 に答える