0

実行時に HTML 汎用コントロールを (ul) および (il) として作成しました。次に、ページ内をループして、実行時に作成されたすべての ul と il を取得したいのですが、ボタンをクリックすると、作成したすべてのコントロールが消えます。ループするためにページに保存するにはどうすればよいですか?

protected void AddHtmlGroups( int groups,ArrayList judids ,int judnum)
{
    for (int i = 1; i <= groups; i++)
    {
        HtmlGenericControl myUnOrderedList = new HtmlGenericControl("ul");
        HtmlGenericControl fieldset = new HtmlGenericControl("fieldset ");

        HtmlGenericControl legend = new HtmlGenericControl("legend  ");

        legend.InnerText="المجموعه " + i.ToString();
        legend.Attributes.Add("class", "group");
        myUnOrderedList.Controls.Add(legend);
        myUnOrderedList.ID = i.ToString()+"g";

        myUnOrderedList.Attributes.Add("class", "profList column");

        for (int j = 1; j <= judnum; j++)
        {
            if (judids.Count > 0)
            {
                HtmlGenericControl listItem = new HtmlGenericControl("li");
                listItem.ID = judids[0].ToString();
                string judname = getjudgeName(Convert.ToInt32(judids[0]));
                if (judname != null)
                {
                    listItem.InnerText = judname;
                }
                judids.RemoveAt(0);

                myUnOrderedList.Controls.Add(listItem);
            }
        }

        fieldset.Controls.Add(myUnOrderedList);

        Panel1.Controls.Add(fieldset);
        Panel1.Visible = true;
    }
}
4

1 に答える 1

1

ボタンをクリックすると、作成したすべてのコントロールが消えます

おそらく、ポストバックを引き起こすボタンをクリックすると、ページが再作成されます。OnInitまたはOnLoad( OnLoadViewState にアクセスする必要がある場合に使用します)からページが読み込まれるたびに、動的コントロール ツリーを再構築する必要があります。

コントロール ツリーが再作成されると、項目の読み取り、項目の追加、項目の削除など、それに対してアクションを実行できます。

多くの場合、コントロール ツリーは、ポストバック間の状態を「記憶」する必要があります。以下を使用できます。

  • ViewState (ページのサイズが大幅に増加するため、限られた量でのみ使用してください)

  • セッション状態 (キューを使用して、各セッションが限られた数のオブジェクトしか持てないようにします)。

  • データベース (変更を保持する場合、および/またはデータベースからコントロール ツリーを再作成できる場合に使用します)。

これは、状態メカニズムとして Session を使用したフローを示す非常に単純な例です。Session を使用すると、サーバーのメモリが消費され、そのセッション内の任意のページからアクセスできることに注意してください (そのため、ユーザーが同じページを 2 つ同時に開くと、競合が発生する可能性があります)。

protected override void OnLoad( EventArgs e)
{
    // build every time the page loads
    BuildTree();
}

private void BuildTree()
{
    // clear existing dynamic controls
    this.MyOutputPanel.Controls.Clear();

    // if there is a value in session, use it
    if( Session["Number"] != null )
    {
        int number = (int)Session["Number"];

        // create some dynamic controls
        for( int i = 0; i < number; i++ )
        {
            var div = new HtmlGenericControl( "div" );
            this.MyOutputPanel.Controls.Add( div );
        }
    }

    // otherwise, do nothing
}

protected void btnDoSomething_Click( object sender, EventArgs e )
{
    // 1. Get the value from the user and store it in Session
    Session["Number"] = Convert.ToInt32( this.txtFoo.Text );

    // 2. rebuild your tree of controls
    BuildTree();
}
于 2012-04-07T00:46:26.430 に答える