PostBack后如何保留新控件?

时间:2017-10-05 17:56:07

标签: c# asp.net webforms

我正在创建一个允许用户创建自己的表单的Web应用程序。但是一旦添加了一个控件(例如一个带有控件的新标签),当我尝试将另一个对象添加到表单时,它将被删除。 这是创建新项目的按钮的代码。

protected void createFormButton_Click(object sender, EventArgs e)
    {

       ////titles is the div id of where i want to insert the title label
        var titlelabel = new Label();
        titlelabel.Text = textboxForTitle.Text;
        titles.Controls.Add(titlelabel);
        controls.Add(titlelabel);

        if (optionsDropdown.SelectedValue == "Checkbox")
        {
           //elements is the div id of where i want to insert the control
            var newControl = new CheckBox();
            newControl.CssClass = "checkbox";
            newControl.Checked = true;
            elements.Controls.Add(newControl);
            controls.Add(newControl);
        }

        else if (optionsDropdown.SelectedValue == "Textbox")
        {
           //elements is the div id of where i want to insert the control
            var newControl = new TextBox();
            newControl.Text = "this is some text on the new box";
            newControl.CssClass = "form-control";
            elements.Controls.Add(newControl);
        }

        else if (optionsDropdown.SelectedValue == "Dropdown")
        {
           //elements is the div id of where i want to insert the control
            var newControl = new DropDownList();
            newControl.Items.Add("one");
            newControl.Items.Add("two");
            newControl.Items.Add("three");
            newControl.CssClass = "form-control";
            elements.Controls.Add(newControl);
        }
    }

如何保存新控件,所以每次按下按钮都会在回发时删除之前的控件?

2 个答案:

答案 0 :(得分:1)

动态添加控件时,会在每次回发时删除它们。现在,如果您遵循asp页面的生命周期,您会注意到viewstate(包含来自客户端对象的所有数据的变量)位于page.init之后。因此,当在asp中使用动态添加的控件时,您需要在page.init事件中的每个回发中重新创建。然后将viewstate加载到thoses控件中。我这样做的方法是在会话中将每个控件创建在一个(控件的)列表中,并将它们添加到page.init的占位符中

答案 1 :(得分:-2)

您可以创建一个类级别变量,它是一个控件列表,而不是将项目添加到内置控件集合中。在您的情况下,您需要两个,因为您要向页面和元素div添加控件。这些列表将在回发中保留,因此每次您可以通过AddRange在方法结束时相应地重新填充页面控件。

注意:代码未经测试。

List<Control> pageControls = new List<Control>();
List<Control> elementControls = new List<Control>();

protected void createFormButton_Click(object sender, EventArgs e)
    {

       ////titles is the div id of where i want to insert the title label
        var titlelabel = new Label();
        titlelabel.Text = textboxForTitle.Text;
        titles.Controls.Add(titlelabel);
        pageControls.Add(titlelabel);

        if (optionsDropdown.SelectedValue == "Checkbox")
        {
           //elements is the div id of where i want to insert the control
            var newControl = new CheckBox();
            newControl.CssClass = "checkbox";
            newControl.Checked = true;
            elements.Controls.Add(newControl);
            pageControls.Add(newControl);
        }

        else if (optionsDropdown.SelectedValue == "Textbox")
        {
           //elements is the div id of where i want to insert the control
            var newControl = new TextBox();
            newControl.Text = "this is some text on the new box";
            newControl.CssClass = "form-control";
            elementControls.Add(newControl);
        }

        else if (optionsDropdown.SelectedValue == "Dropdown")
        {
           //elements is the div id of where i want to insert the control
            var newControl = new DropDownList();
            newControl.Items.Add("one");
            newControl.Items.Add("two");
            newControl.Items.Add("three");
            newControl.CssClass = "form-control";
            elementControls.Add(newControl);
        }
        Controls.AddRange(pageControls);
        elements.Controls.AddRange(elementControls);
    }