4

可変数のユーザー コントロールを追加する ASP.NET Web フォームがあります。2 つの問題があります。

  1. ユーザー コントロールは、最初の PageLoad イベントでフォームの PlaceHolder に追加されます ("(!this.IsPostback)" の場合にのみ追加しますが、フォームがポストバックされると、コントロールはなくなります。これは正常ですか?フォーム上の他のコントロールは状態を保持しますが、これらの動的に追加されたコントロールもフォームに保持されると思います.ポストバックごとにそれらを追加する必要がありますか?

  2. ボタン クリック イベント用のボタンとイベント ハンドラーもありますが、ボタンをクリックしてもこのイベント ハンドラーが呼び出されることはありません。動的に追加されたコントロールでイベントをキャッチするために何か特別なことをしなければなりませんか?

4

6 に答える 6

3
  1. はい、ポストバックごとに追加する必要があります。
  2. はい... asp.net がイベントをディスパッチする前に、コントロールをコントロール階層に配置する必要があります (つまり、ページ ライフサイクルのできるだけ早い段階で動的コントロールを作成します)。
于 2008-12-23T20:00:05.013 に答える
0

私はまったく同じ問題に遭遇し、5〜6時間ほど苦労しました. 私はこれを投稿しています。私のような誰かが助けを得ることができるかもしれません。

1) Page.PreInit イベントでコントロールを初期化する必要があります。(私の場合、コントロールをプレースホルダーに追加する必要があったため、PreInit を拡張してそれらのコントロールをロードするようにしましたが、その必要はありません。シナリオによって異なります。)

2) Page.PreInit イベントでそれらを初期化した後、これらの正確なメソッドをコントロールにバインドする必要があります。

ここに私のサンプルコードがあります:

protected override void OnPreInit(EventArgs e)
{
    // Loading controls...
    this.PrepareChildControlsDuringPreInit();

    // Getting ddl container from session and creating them...
    if (GetDDLSession().Count != 0)
    {
        foreach (DropDownList ddl in GetDDLSession())
        {
            ddl.SelectedIndexChanged += SelectedIndexChanged;
            phDropDowns.Controls.Add(ddl);
        }
    }
    base.OnPreInit(e);
}

public static void PrepareChildControlsDuringPreInit(this Page page)
{
    // Walk up the master page chain and tickle the getter on each one 
    MasterPage master = page.Master;
    while (master != null) master = master.Master;
}
于 2013-09-20T12:50:19.347 に答える
0

同様の問題に遭遇しました。カスタム Web コントロールのコレクションを表示するページがありました。私の解決策は、非表示の Web コントロールを追加して、ボタンをクリックして別のコントロールを追加したときに、非表示のコントロールを使用することでした。その後、ポストバックすると、load 関数が別の非表示のコントロールをコレクションに追加します。

于 2009-03-31T20:35:35.813 に答える
0

昨日、loadviewstateevent が発生した直後にコントロール ツリーを読み込むことで、実際にアプリを通常どおりに動作させることができることがわかりました。loadviewstate イベントをオーバーライドし、mybase.loadviewstate を呼び出してから、その直後にコントロールを再生成する独自のコードを配置すると、これらのコントロールの値はページの読み込み時に利用できるようになります。私のアプリの 1 つで、viewstate フィールドを使用して、これらのコントロールを再作成するために使用できる ID または配列情報を保持しています。

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub
于 2009-07-16T13:19:59.007 に答える
0
  1. これを実現するには、ページの読み込みではなく、ページの初期化時にコントロールを追加します。(ポストバック時に再追加)
  2. ボタンをイベントにバインドするには、追加されたボタンの ID を知る必要があります。
于 2008-12-23T19:59:11.473 に答える
0

1)Pre-init(ページライフサイクル)にコントロールを追加する必要があります

2) 作成されたボタンのイベントにイベント ハンドラーをアタッチする必要があります。

于 2008-12-23T20:00:56.230 に答える