0

複数の (およびネストされた) コントロールを PlaceHolder に追加する必要があるアプリケーションがあります。ユーザーが「週」の数を入力すると、私のアプリケーションは (Telerik コントロール セットを使用して) RadSplitter を、その週に関連するペイン/グリッドと共に追加します。コード ビハインドを使用してこれらのコントロールを追加します。

これは、最初のバインド時 (週数を入力して [送信] をクリックするとき) に問題なく機能します。しかし、ポストバックの原因となるコントロール間のドラッグ アンド ドロップ機能も有効にする必要があります。

私のプレースホルダーのコントロールの数はポストバックで常に「0」であるように見えるので、それらは ViewState に保存されていないと推測しています。ポストバックごとにこれらを読み上げるのではなく、自分のコントロールが ViewState に確実に格納されるようにするにはどうすればよいですか?

コード例を次に示します。

      protected void btnSubmit_Click(object sender, EventArgs e)
        {
            if (plcSplitter.Controls.Count > 0)
                plcSplitter.Controls.Remove(plcSplitter.Controls[0]);
            var splitter = new Telerik.Web.UI.RadSplitter();
            splitter.Width = Unit.Percentage(100);
            int noOfWeeks = int.Parse(txtNoOfWeeks.Text);
            DateTime dt = new DateTime(2012, 05, 13);
            for (int i = 0; i < noOfWeeks; i++)
            {
                var range = new Common.DateRange(dt.AddDays(-6),dt);
                var pane = new Telerik.Web.UI.RadPane();
                Label lbl = new Label();
                lbl.ID = "lblText";
                lbl.Text = range.To.ToShortDateString();
                pane.Controls.Add(lbl);
                var gv = AddGrid(i);
                pane.Controls.Add(gv);
                splitter.Items.Add(pane);

                var splitLine = new Telerik.Web.UI.RadSplitBar();
            splitter.Items.Add(splitLine);

                dt = dt.AddDays(-7);
            }
            plcSplitter.Controls.Add(splitter);
            splitter.DataBind();
}
4

3 に答える 3

2

コントロールはビューステートに格納されません。一部のコントロール プロパティのみがビューステートに格納されます。そのため、ポストバック時にこれらのラベルを再度作成する必要があります。

そのロジックを移動してラベルを作成するロジックを btnSubmit_Click から別のメソッドに移動し、ボタンのクリック時にそのメソッドを呼び出し、ラベルを再作成するために必要なデータをどこかに保存します (おそらくセッション)。その後、OnInit メソッドでポストバック時にその保存されたデータをチェックし、いくつかのラベルがある場合はそれを作成しますそのイベントで。

viewstate に関する次のブログ投稿を必ずお読みください。

http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx

これは実行時のコントロールの作成についてです

http://weblogs.asp.net/infinitiesloop/archive/2006/08/25/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_.aspx

于 2012-05-14T15:46:32.357 に答える
1

コントロールを構築するために必要なデータを ViewState に格納できますが、本当に重要な部分は、アクセスする前にコントロールが構築されていることを確認することです。

これは超基本的な例です。

    protected void Page_Load(object sender, EventArgs e)
    {
        BuildControl(GetLabelData());
    }

    private Tuple<string, string> GetLabelData()
    {
        if (Page.IsPostBack)
            return (Tuple<string, string>)ViewState["MyLabelData"];
        else
            return new Tuple<string, string>("lblTest", "Test");
    }

    private void BuildControl(Tuple<string, string> t)
    {
        Label l = new Label();
        l.ID = t.Item1;
        l.Text = t.Item2;
        ViewState["MyLabelData"] = t;
        plcSplitter.Controls.Add(l);
    }

    protected void bDoSomething_Click(object sender, EventArgs e)
    {
        Response.Write(String.Format("plcSplitter.Controls.Count:{0}", plcSplitter.Controls.Count));
    }

また、これらのコントロールがサーバーで構築されていることを認識することも非常に重要です。クライアントによって変更される可能性がある場合は、コントロールを再構築してから適用できるように、重要な情報のための何らかの通信メカニズムを実装する必要があります。クライアントからの変更。

たとえば、ドラッグ可能なコントロールを実装している場合、ドラッグするときにクライアント側で座標を非表示のコントロールに手動で保存する必要があります。これにより、サーバーにポストバックされ、再構築時にその情報を利用できるようになります。コントロール。

于 2012-05-14T16:10:26.167 に答える
0

これらのコントロールがViewStateに保存されない理由は、ページViewStateが生成された後、それらが「遅すぎる」ページに追加されているためだと思います。この投稿を見てください:

ページのビューステートに影響を与える可能性のあるページ内の最後のイベント

于 2012-05-14T15:41:41.003 に答える