我有一个页面,我在其中创建一个动态表,包含引发事件的动态控件。 它有效,但我不想在某些事件中重新生成该表(所以在page_load之后)以打印表修改。
我理解这个问题,此时我的控件不会在viewstate中保留,因为它们是在page_load之后创建的,并且它们的事件不会被引发。但我怎么能这样做?
这是我的代码:
protected void Page_Load(object sender, EventArgs e)
{
generateTable(); // When pass just here, it works well
}
private void generateTable()
{
Table tbl = new Table();
// Here I create my table with controls
tableContainer.Controls.Clear(); // tableContainer is a Panel fixed in aspx page
tableContainer.Controls.Add(tbl);
}
protected void txt_TextChanged(object sender, EventArgs e)
{
// Do some stuff to change values in the table
generateTable(); // Re-generate (but events will not be raised)
}
更新1:
我想到了一些事情(这使我的开发变得复杂),但我应该做generateTable,它创建我的所有行和控件,并在每个page_load上调用它。另一方面,创建另一种填充控件的方法?所以在活动中,我打电话给第二个。
但是我的表是动态生成的,并且控件也可以在事件之后添加(我有一个下拉列表,在表中创建一个新行和控件,所以我也卡在这里因为我不会看到该行在第一次回发?)
答案 0 :(得分:0)
您应该在PageInit事件上生成控件。在PageInit上生成的控件由asp.net框架自动管理(您将获得视图状态持久性,引发事件等...)
只是旁注:在PageInit上,您必须始终重新生成动态控件,否则框架将无法管理它们。
尝试在PageInit上生成控件,然后在回发事件上更改其属性,如下所示:
List<LiteralControl> list = new List<LiteralControl>();
protected void Page_Init(object sender, EventArgs e)
{
generateTable(); // When pass just here, it works well
}
private void generateTable()
{
Table tbl = new Table();
// Here I create my table with controls
int rows = 3;
int cols = 2;
for (int j = 0; j < rows; j++)
{
TableRow r = new TableRow();
for (int i = 0; i < cols; i++)
{
TableCell c = new TableCell();
LiteralControl l = new LiteralControl("row " + j.ToString() + ", cell " + i.ToString());
// save a reference to the control for editing
list.Add(l);
c.Controls.Add(l);
r.Cells.Add(c);
}
tbl.Rows.Add(r);
}
tableContainer.Controls.Clear(); // tableContainer is a Panel fixed in aspx page
tableContainer.Controls.Add(tbl);
}
protected void txt_TextChanged(object sender, EventArgs e)
{
// edit controls here
foreach (LiteralControl ctrl in list)
{
ctrl.Text = "TextChanged";
}
}
答案 1 :(得分:0)
这是一个非常好的链接,描述了动态添加控件的管理:http://devcenter.infragistics.com/Articles/ArticleTemplate.ASPX?ArticleID=2149
请注意,一旦在ASP.NET后端的控件中添加控件,就必须设置属性
ViewState["AddedControl"] = "true";
此外,在回发期间,您的页面将被重新生成,因此您必须重新创建控件并重新设置旧值。
来自同一个链接:
public void Page_Load() {
if (IsPostBack) {
if (ViewState["AddedControl"] != null) {
// Re-create the control but do not
// restore settings configured outside
// the proc (i.e., MaxLength and BackColor)
TextBox t = AddTextBox();
}
}
}
public void OnClick(object sender, EventArgs e) {
TextBox t = AddTextBox();
// Modify properties outside the proc to
// simulate generic changed to the
// control's view state
t.MaxLength = 5;
t.BackColor = Color.Yellow;
}
public TextBox AddTextBox() {
TextBox ctl = new TextBox();
ctl.Text = "Hello";
placeHolder.Controls.Add(ctl);
// Records that a dynamic control has been added
ViewState["AddedControl"] = "true";
return ctl;
}