2

タイトルに従って、カスタムコントロールを作成しました。

特定のボタンクリックイベントで、このコントロールがインスタンス化され、ページに追加されます。

これは動的なコントロールであり、独自のボタンイベントがあります。

これらのボタンイベントをトリガーするには、後続のpage_load / onloadライフサイクルステージで、Page_Load/の終わりまでにコントロールを描画する必要があります。OnLoad

私の問題は、このコントロールをどのように永続化するかです。Sessionシリアル化できないアイテムが含まれているため、オブジェクトに保存できません。

4

4 に答える 4

3

通常、動的制御の場合、ポストバックごとに追加する必要があり、イベントは毎回接続する必要があります。

于 2011-04-06T14:11:39.467 に答える
2

すべてのポストバックで動的コントロールを再作成する必要があります。それを行うのに最適な場所はメソッドCreateChildControlsです。

クリックハンドラーでボタンクリックが設定された後に動的にコントロールを追加するには、いくつかのフラグ(永続フラグ-したがって、ビューステートまたはセッションステートにある必要があります)-次のページの作成時にコントロールを追加する必要があることを示す必要があります。この後、次のように設定する必要がChildControlsCreated = false;
あります。この後、CreateChildControlsが再度実行され、コントロールが正しく作成され、永続的です(フラグをクリアしないまで)。

したがって、次のように実行する必要があります。

protected override void CreateChildControls()
{
        base.CreateChildControls();
    if (ViewState["AddControl"] == true)
        {
         Controls.Add(new MyControl() {Id = "someId" });
        }
}

そしてbtnハンドラー

private void OnShowControlClick(object sender, EventArgs e)
{
         ViewState["AddControl"] = true;
         ChildControlsCreated = false;
}
于 2011-04-06T14:17:27.770 に答える
0

私はあなたがする必要があるのはpreinitの間に同じIDでそれを再作成することであると信じています、そしてasp.netエンジンはそれをビューステートから移入します。

これは頭​​から離れているので、詳細が少しずれているかもしれません。

于 2011-04-06T14:11:22.467 に答える
0

すべてのHTMLページと同様に、コントロールはページリクエストごとに再作成する必要があります。ASP.NETは、ViewStateやSessionなどのメカニズムを使用して、この「内部」の多くを処理します。

コントロールがViewStateによって追跡されない(または追跡できない)場合は、これを自分で処理する必要があります。

コントロールがどれほど複雑かはわかりませんが、出発点として、ここでCreateChildControlsイベント(MSDN)の処理について確認することをお勧めします。

于 2011-04-06T14:14:24.473 に答える