我正在动态添加TextBoxes,当我单击一个提交按钮并进行回发时,我看不到输入到TextBox中的值,所有这些都是emtpy。这是.aspx页面...... \
form id="form1" runat="server">
<asp:PlaceHolder ID="phFormContent" runat="server">
</asp:PlaceHolder>
<br /><br />
<asp:Button ID="btnAddForm" runat="server" Text="Add Form" OnClick="btnAddForm_Click" />
<asp:Button ID="btnSubmitForms" runat="server" Text="Submit Forms" OnClick="btnSubmit_Click" />
</form>
...这是我在单击btnAddForm时将TextBoxes添加到表单的方式...
protected void btnAddForm_Click(object sender, EventArgs e)
{
// Create Labels
Label lblName = new Label();
lblName.Text = "NAME:";
Label lblNumber = new Label();
lblNumber.Text = "NUMBER:";
Label lblAddress = new Label();
lblAddress.Text = "ADDRESS:";
Label lblCompany = new Label();
lblCompany.Text = "COMPANY:";
// Create Text Boxes
TextBox txtName = new TextBox();
TextBox txtNumber = new TextBox();
TextBox txtAddress = new TextBox();
TextBox txtCompany = new TextBox();
// Create submit button
Button btnSubmit = new Button();
btnSubmit.Text = "SUBMIT";
// Create panel and add controls
Panel pnlForm = new Panel();
pnlForm.Controls.Add(lblName);
pnlForm.Controls.Add(txtName);
pnlForm.Controls.Add(new LiteralControl("<br /><br />"));
pnlForm.Controls.Add(lblNumber);
pnlForm.Controls.Add(txtNumber);
pnlForm.Controls.Add(new LiteralControl("<br /><br />"));
pnlForm.Controls.Add(lblAddress);
pnlForm.Controls.Add(txtAddress);
pnlForm.Controls.Add(new LiteralControl("<br /><br />"));
pnlForm.Controls.Add(lblCompany);
pnlForm.Controls.Add(txtCompany);
pnlForm.Controls.Add(new LiteralControl("<hr />"));
pnlForm.Controls.Add(new LiteralControl("<br /><br />"));
panels.Add(pnlForm);
foreach (Control panel in panels)
{
phFormContent.Controls.Add(panel);
}
}
...以下是我尝试为每个添加的面板提取字段的方法......
private static void GetFormFields(Control panelControl)
{
ControlCollection controls = panelControl.Controls;
foreach (Control childControl in panelControl.Controls)
{
if (childControl.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
TextBox txt = childControl as TextBox;
fields.Add(txt);
}
else
{
GetFormFields(childControl);
}
}
}
面板和字段是静态List,每个面板包含四个字段。我将GetFormFields传递给单个面板引用...
private static List<Control> panels = new List<Control>();
private static List<TextBox> fields = new List<TextBox>();
答案 0 :(得分:3)
尝试在Page_Init
事件中动态添加它们。通常,这将确保它们持续PostBack
。如果您无法执行此操作,则必须通过存储在ViewState
中手动保留其数据。
答案 1 :(得分:2)
看起来文本框没有包含在页面的VIEWSTATE中,因此在回发时会丢失。
这里有关于此场景中发生的事情的一些细节:
http://msdn.microsoft.com/en-us/library/kyt0fzt1(v=VS.71).aspx