我正在创建一个允许用户创建自己的表单的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);
}
}
如何保存新控件,所以每次按下按钮都会在回发时删除之前的控件?
答案 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);
}