我正在通过文本更改事件的后端创建一些TextBox,如下所示:
protected void txtHowMany_TextChanged(object sender, EventArgs e)
{
int totalSections = Convert.ToInt32(txtHowMany.Text.Trim());
for (int i = 1; i <= totalSections; i++)
{
TextBox tbx = new TextBox();
tbx.Text = "";
tbx.ID = "section" + i;
tbx.Style.Add("width", "90%");
tdSectionsAdd.Controls.Add(tbx);
}
trSectionsName.Visible = true;
}
自动回复对于 txtHowMany 是正确的,所以当我输入一个数字时,它会生成文本框并将其添加到表格分区
现在的问题是,我试图从生成的文本框中获取文本,如下所示:
protected void btnSave_click(object sender, EventArgs e)
{
int numbersOfSectionsToSave = 1;
int sectionsToSave =Convert.ToInt32(txtHowMany.Text.Trim());
for (int i = 1; i < sectionsToSave; i++)
{
Sections section = new Sections();
section.CourseId = result;
section.OrganizationId = course.OrganizationId;
foreach (Control c in tdSectionsAdd.Controls)
{
if (c.GetType() == typeof(TextBox))
{
TextBox txtBox = (TextBox)c;
string id = "section" + i;
if (txtBox.ID == id)
{
section.Name = txtBox.Text.Trim();
}
}
}
string name = Request.Form["section1"];
section.CreatedBy = "Admin";
section.CreationDate = DateTime.Now;
section.ModifiedBy = "Admin";
section.ModificationDate = DateTime.Now;
numbersOfSectionsToSave += section.SaveSection();
}
但是它显示了 tdSectionsAdd 中控件的0计数,控件是在我尝试访问它们之前添加的,但它仍然在td中没有显示任何控件。 请帮忙,我怎样才能获得这些文本框?
谢谢!
答案 0 :(得分:2)
您需要在每个回发中添加它们。将totalSections
变量存储在ViewState中,以便您也可以在页面加载时添加它们:
protected void AddTextBoxes()
{
int totalSections;
if (int.TryParse(Convert.ToString(ViewState["TotalSections"]), out totalSections)
{
for (int i = 1; i <= totalSections; i++)
{
TextBox tbx = new TextBox();
tbx.Text = "";
tbx.ID = "section" + i;
tbx.Style.Add("width", "90%");
tdSectionsAdd.Controls.Add(tbx);
}
trSectionsName.Visible = true;
}
}
protected void txtHowMany_TextChanged(object sender, EventArgs e)
{
ViewState["TotalSections"] = Convert.ToInt32(txtHowMany.Text.Trim());
tdSectionsAdd.Controls.Clear();
AddTextBoxes();
}
protected void Page_Load(object sender, EventArgs e)
{
AddTextBoxes();
}
答案 1 :(得分:1)
动态创建控件在回发时“消失”,如果它们未在该页面的Page_Init中“重新创建”。
只有在page_init中创建它们时,页面的视图状态才会更新其信息。
长解释: 当我们执行回发(或部分回发)时,我们希望能够访问这些控件(或至少是用户放入它们的值)。 我们知道数据在viewstate中,但ASP.NET并不真正知道ViewState项属于哪个控件。它只知道通过相同的索引匹配一个视图状态项和一个控件(例如,视图状态树中的匹配项n到控制树中的项n)。因此,为了获取动态控件的数据,我们需要在每次页面回发时重新创建控件。 但为了使其工作,我们需要在Page_Init函数中重新创建控件而不是在Page_Load中。 为什么?因为在创建ViewState时,它需要已存在的所有控件。
这是从MSDN获取的,因为您可以看到viewstate是在init之后但在页面加载之前加载的。
TL; DR 调用在page_init中创建动态控件的函数,您应该能够看到用户在页面回发时输入的所有值
关于此问题的一些链接:
http://forums.asp.net/t/1186195.aspx/1
ASP.NET - Dynamic controls created in Page_Pre_init() or Page_Init() or Page_Load()
选项2:
我应该注意:如果控件都有唯一ID并且 你不想再次重新创建它们每次回发 - 你总是可以在请求对象。 Request.Form是一个NameValueCollection,它保存作为表单一部分的所有控件的值,只需搜索它以寻找您想要的任何内容