刚开始我在页面上放了一个空Table:
<asp:table id="danxuanTable" Runat="server" Width="100%"></asp:table>然后在if(!IsPostBack)中动态添加表中的内容:如
TableRow row1= new TableRow();
TableCell cell1 = new TableCell();
cell1.Text= j.ToString() +". " + reader2["subject"].ToString();
row1.Cells.Add(cell1);
this.danxuanTable.Rows.Add(row1);
能够正常显示可是当我点击按钮,提交页面时却发现danxuanTable变为空,请问这是怎么回事呢?动态生成的东西不能保存吗?我想在提交页面时得到动态生成的Table应该怎样做呢?

解决方案 »

  1.   

    你因为你if(!IsPostBack)了,提交的时候不生成了,
    动态生成的控件不会自动保存状态的
      

  2.   

    把生成DATATABLE的代码放在if(!IsPostBack)外边,就行了。
      

  3.   

    可是我的目的是在点击按钮提交之后取得用户在页面上的选择结果,要是把生成DATATABLE的代码放在if(!IsPostBack)外面,提交之后页面就恢复了初始状态了,用户所做的选择也就消失了呀
      

  4.   

    1. 动态控件要在首次加载和 postback 时都创建,才可以自动保存其状态。而且,这两次创建的时候,控件id 要一样。2. 要先把创建出来的 Row, Cell 等对象加入到他的父控件的集合中去,然后再赋各种属性值,如 Text 等。因为这样才可以在触发 ViewState 的跟踪之后(TrackingViewState()),保存属性的值。否则可能不正常。3. 对于你的问题,基本上可以这样写:if (!IsPostBack) {
    TableRow row1= new TableRow();
    this.danxuanTable.Rows.Add(row1);
    TableCell cell1 = new TableCell();
    row1.Cells.Add(cell1);
    cell1.Text= j.ToString() +". " + reader2["subject"].ToString();
    } else {
    TableRow row1= new TableRow();
    this.danxuanTable.Rows.Add(row1);
    TableCell cell1 = new TableCell();
    row1.Cells.Add(cell1);
    }
    注意这段代码中,.Text 属性的赋值时机和次序。
      

  5.   

    如先赋值再加入父控件,则之前的赋值,因为 viewstate 还没有被标注为 dirty, 可能不会被正确保存。所以创建动态控件时,这个代码次序一般可作为一个 best practise 的做法来遵循。