0

Webforms アプリで動的に追加されたユーザー コントロールのビューステートを維持する方法に行き詰まっています。Set.ascx という名前のユーザー コントロールを作成しました。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Set.ascx.cs" Inherits="CustomControlLab.Set" %>
&nbsp
<asp:Label ID="BodyArea" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
&nbsp
<asp:Label ID="Exercise" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
&nbsp
<asp:Label ID="SetNo" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
&nbsp
<asp:Label ID="Reps" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>

ユーザーは、ドロップダウン リストから項目を選択して、各ラベルの値を設定します。これは、ボタン クリック イベントで次のように設定されます。

    protected void AddExercise_Click(object sender, EventArgs e)
    {
            Set set = (Set)Page.LoadControl("Set.ascx");
            int currentSet = (int)ViewState["Sets"];
            set._bodyArea = AreaSelect.SelectedValue;
            set._exercise = ExerciseSelect.SelectedValue;
            set._reps = RepNumbers.SelectedValue;
            set._setNumber = currentSet.ToString();
            int idCount = (int)ViewState["Sets"];
            set.ID = string.Format("set{0}", idCount);
            currentSet++;
            ViewState["Sets"] = currentSet;
            WeightList.Controls.Add(set);
     }

これにより、ユーザー コントロールが Panel コントロールの WeightList に正しく追加されます。私がうまくいかないのは、ページの初期化イベントでこれらのコントロールを正常に再作成する方法です? コントロールIDと関係があると思いますか?あるいは、私のアプローチは決してうまくいかないかもしれません。どんなフィードバックでも本当に役に立ちます!!

Tims のコメントに続いて、ID を使用して UserCONtrol を再ロードする方法がわかりません。ポストバックした場合、Page_Loadイベントでこれを試しました:

      else
        {
            if(ViewState["Sets"] != null)
            {
            int sets = (int)ViewState["Sets"];
            for (int i = 0; i < sets; i++)
            {
                Set set = new Set();
                set = (Set)Page.FindControl(string.Format("MainContent_set{0}", i + 1));
                WeightList.Controls.Add(set);

            }
            }


        } 

しかし、それは Set オブジェクトを再作成していません。各 Set UC がロードされたときにページを見ると、次のように表示されます。

&nbsp
<span id="MainContent_set1_BodyArea" class="SetLabel">All Exercises</span>
&nbsp
<span id="MainContent_set1_Exercise" class="SetLabel">Bench Press</span>
&nbsp
<span id="MainContent_set1_SetNo" class="SetLabel">1</span>
&nbsp
<span id="MainContent_set1_Reps" class="SetLabel">3</span>

コントロールの各ラベルには、値を設定するためのパブリック プロパティがあります。

public partial class Set : System.Web.UI.UserControl
{
    public string _exercise { get { return Exercise.Text; } set { Exercise.Text = value; } }
    public string _bodyArea { get { return BodyArea.Text; } set { BodyArea.Text = value; } }
    public string _setNumber { get { return SetNo.Text; } set { SetNo.Text = value; } }
    public string _reps { get { return Reps.Text; } set { Reps.Text = value; } }

    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

ページにレンダリングされたものに続いて、私は次のことを行うことができました(これは機能しません!!)

      else
    {
        if(ViewState["Sets"] != null)
        {
        int sets = (int)ViewState["Sets"];
        for (int i = 0; i < sets; i++)
        {
            Set set = new Set();
            Label templbl = (Label)Page.FindControl(string.Format("MainContent_set{0}_BodyArea", i + 1));
            set._bodyArea = templbl.Text;
            //Other code to get rest of control values 
            WeightList.Controls.Add(set);

        }
        }


    } 

しかし、これもうまくいきません。ここで明らかな何かが欠けていると思いますか?

4

1 に答える 1

0

ページの読み込みでこれを試してください:

if(ViewState["Sets"] != null)
{
    int sets = (int)ViewState["Sets"];
    for (int i = 0; i < sets; i++)
    {
        Set set = new Set();
        set.ID =  string.Format("set{0}", i);
        WeightList.Controls.Add(set);
     }
 }

ページに適切な Id を持つコントロールがある限り、ビューステートから値が読み込まれます。

于 2012-11-25T12:09:09.643 に答える