1

我有一个页面,我在其中创建了一个动态表,其中包含引发事件的动态控件。它有效,但我不想在某些事件中重新生成该表(因此在 page_load 之后)以打印表修改。

我理解这个问题,此时我的控件没有保留在视图状态中,因为它们是在 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 上调用它。另一方面,创建另一种填充控件的方法?所以在事件中,我称之为第二个。

但是我的表是动态生成的,也可以在事件之后添加控件(我有一个下拉列表,它在表中创建一个新行和控件,所以我也被困在这里,因为我一开始看不到该行回发?)

4

2 回答 2

1

这是一个描述动态添加控件管理的非常好的链接:https ://web.archive.org/web/20050321094957/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;
}
于 2013-06-04T10:29:28.300 回答
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";
    }
}
于 2013-06-04T10:25:25.383 回答