2

ページを開発しようとしています。ボタンとプレースホールダーがあります。ボタンをクリックすると、ユーザー コントロールがプレースホルダーに追加されます。

ボタンをクリックするたびに、多くのユーザー コントロールをプレースホルダーに追加する必要があります。

preinit イベントでプレースホルダーをビューステートに保存しようとしていますが、ロード イベントでビューステートからプレースホルダーを取得している間、ビューステートは null のままです。

以下は私のコードです:

  protected void PreInit(object sender, EventArgs e)
        {
            this.OnPreInit(e);
            if (!Page.IsPostBack)
            {
                ViewState["c"] = PlaceHolder1;

            }
            else { PlaceHolder1 = (PlaceHolder)ViewState["c"]; }
        }

 protected void Page_Load(object sender, EventArgs e)
        {

            if(IsPostBack)
        { PlaceHolder1=  (PlaceHolder)ViewState["c"]; }

        }


 public void addDepartmentBtn_Click(object sender, EventArgs e)
        {
            // User Control Code


            c1 = LoadControl("~/AddDepartment.ascx");
            PlaceHolder1.Controls.Add(c1);
}

このシナリオでviewstateが適切でない場合、これを達成するための代替方法は何ですか?

4

3 に答える 3

2

ページにコントロールを動的に追加しようとしている場合は、各ポストバックのInitで行う必要があります。 これは、動的に作成されたコントロールのリストとしてデータ構造(ViewStateで永続化されたものでもかまいません)を使用する必要があることを意味します。コントロール自体ではなく、IDとして使用する文字列のハッシュが一般的な方法です。

ユーザーがページにコントロールを追加するために何かをするたびに、リストにキーを追加します。次に、ページの初期化で、リストを読み取り、それを使用して動的コントロールを再作成し、ページコレクションに追加し直す必要があります。そうしないと、ページに表示されません。

于 2012-11-28T19:56:20.963 に答える
2

各ポストバックのプレースホルダーにコントロールを再度追加する必要があります。

ViewStateへの試みは間違ったツリーを吠えています-ViewStateはまったく異なるもののためのものであり、必要な場合でも、シリアル化可能なもののみをViewStateに格納できます。

于 2012-11-28T19:56:45.757 に答える
1

これは機能しません。ASP.NETサーバーコントロールは複雑すぎて、ViewStateに格納できません。ASP.NETの設計により、サーバーコントロールが行うことは、データ(状態、プロパティ値など)をページのViewStateに格納することです。

実行できることは、作成されてプレースホルダーに追加されたAddDepartmentユーザーコントロールの数をViewStateに格納することです。これはPreRenderで実行できます。次に、ポストバック時に、ViewStateからこの番号を読み取り、多くのAddDepartmentコントロールを作成してプレースホルダーに追加します。

于 2012-11-28T19:55:45.050 に答える