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

当我单击按钮时,我创建的所有控件都消失了

大概您正在单击一个导致回发的按钮,从而导致重新创建页面。每次从OnInitor加载页面时,您都必须重建动态控件树OnLoadOnLoad如果您需要访问 ViewState,请使用)。

重新创建控制树后,您可以对其执行操作,例如读取项目、添加项目、删除项目等。

通常控制树需要在回发之间“记住”它们的状态。您可以使用:

  • ViewState(仅在有限的数量下使用它,因为它会大大增加页面的大小)

  • 会话状态(我使用队列来确保每个会话只能有有限数量的对象)。

  • 数据库(如果您想保留更改和/或如果您可以从数据库重新创建控制树,请使用)。

例子

这是一个非常简单的示例,它演示了以 Session 作为状态机制的流程。请记住,如果您使用 Session,它会消耗服务器内存,并且可以从该会话中的任何页面访问(因此,如果用户同时打开两个相同的页面,您可能会导致冲突)。

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 回答