问题:
点“+新增”按钮很多次,最多只创建2行表格出来。aspx 文件的内容:<asp:FormView ID="FormView1" runat="server" DataKeyNames="id" DataSourceID="SqlDataSource1" DefaultMode="Edit">
<EditItemTemplate>
<asp:Button ID="AddYYButton" runat="server" Text="+新增" onclick="AddYYButton_Click" /><br />
<asp:Table ID="YYTable" runat="server">
</asp:Table>
<asp:HiddenField ID="HiddenField1" runat="server" Value="0" />
</EditItemTemplate>
</asp:FormView>
cs 文件的内容://((HiddenField)FormView1.Row.FindControl("HiddenField1")).Value,用于记录点击新增按钮的次数,即新增多少行    protected void Page_Load(object sender, EventArgs e)
    {
        CreateControlTR();
    }    void CreateControlTR()
    {
        if (ViewState["CreateControlTR"] == null) return;        System.Web.UI.WebControls.TextBox YYDateTextBox1 = new System.Web.UI.WebControls.TextBox();
        YYDateTextBox1.ID = "YYDateTextBox" + ((HiddenField)FormView1.Row.FindControl("HiddenField1")).Value;        CalendarExtender YYDateCalendarExtender1 = new CalendarExtender();
        YYDateCalendarExtender1.ID = "YYDateCalendarExtender" + ((HiddenField)FormView1.Row.FindControl("HiddenField1")).Value;
        YYDateCalendarExtender1.TargetControlID = YYDateTextBox1.ID;        System.Web.UI.WebControls.TextBox YYDateTextBox2 = new System.Web.UI.WebControls.TextBox();
        YYDateTextBox2.ID = "YYProLabel" + ((HiddenField)FormView1.Row.FindControl("HiddenField1")).Value;        TableRow TR = new TableRow();
        TableCell TC1 = new TableCell();
        TableCell TC2 = new TableCell();        TC1.Controls.Add(YYDateTextBox1);
        TC1.Controls.Add(YYDateCalendarExtender1);
        TC2.Controls.Add(YYDateTextBox2);
        TR.Cells.Add(TC1);
        TR.Cells.Add(TC2);
        ((Table)FormView1.Row.FindControl("YYTable")).Rows.Add(TR);
    }    protected void AddYYButton_Click(object sender, EventArgs e)
    {
        if (ViewState["CreateControlTR"] == null)
        {
            ViewState["CreateControlTR"] = true;
        }        ((HiddenField)FormView1.Row.FindControl("HiddenField1")).Value = (int.Parse(((HiddenField)FormView1.Row.FindControl("HiddenField1")).Value) + 1).ToString();  //点击新增按钮的次数+1        CreateControlTR();
    }

解决方案 »

  1.   

    点击超过 2 次以后,表格始终只有 2 行。但是控件 id 后面接的数字会随着点击次数而变化。
    比如点击 4 次,生成的控件 id 就是这样:
    第一行的是 YYDateTextBox3、YYDateCalendarExtender3、YYProLabel3;
    第二行的是 YYDateTextBox4、YYDateCalendarExtender4、YYProLabel4。个人觉得是视图状态没有被记录,不能在当前视图状态的基础上再创建行。实在是不知道怎么解决。求助!!!
      

  2.   

    改成这样试试。
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostback){
                CreateControlTR();
            }
        }
      

  3.   

    if(!IsPostBack)
    {
    CreateControlTR();
    }
      

  4.   

     protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostback){
                CreateControlTR();
            }
        }
      

  5.   

    上面几位,能在vs里测试一下再回答吗。
    用了 if(!IsPostback),只能生成 1 行了。
      

  6.   

    主要是在视图状态方面有问题。应该是每次 load 或者 postback 后,前面动态创建的行没有被保存进视图状态。
      

  7.   

    <asp:Table ID="YYTable" runat="server"></asp:Table>可能是上面的标记不具viewstate特性,就是说每次刷新就没了
      

  8.   

     TC1.Controls.Add(YYDateTextBox1);
            TC1.Controls.Add(YYDateCalendarExtender1);
            TC2.Controls.Add(YYDateTextBox2);
            TR.Cells.Add(TC1);
            TR.Cells.Add(TC2);因为你每一次调用的时候都是2行。
      

  9.   

    每次刷新,CreateControlTR()方法重新,被Page_Load,和AddYYButton_Click个调用一次,很可能上次状态没有记录。
      

  10.   

    用个静态的定义下试试,用静态就要if(!IsPostback){
      CreateControlTR();
      }
      

  11.   


    首先page_load里面加!ispostback是不能省略的,如果你想在一个页面循环操作的话。”ViewState["CreateControlTR"] “的作用不是很明显,除了第一次进入页面时,会屏蔽Page_Load中的”CreateControlTR()“方法的操作。
    而且我也没看出你在Page_Load方法中,写CreateControlTR()的作用。现在问题的表现症状是,每次点击按钮后,控件会在原本为空的表格中新增一行记录,(原来新增两行,是因为你在点击按钮,激活ViewState["CreateControlTR"] 后,Page_Load会新增一行,然后,新增按钮的委托方法会新增一行。),也就是你说的控件在每次新增后,没有记录自身的状态。
    这种情况,你检查一下Page_Load方法中,是不是有”FormView1“的数据绑定操作,从而导致FormView1状态 被重置了。
    问题很大情况出在Page_Load中。
      

  12.   

    不过你也可以用什么保存他的行数,刷新是FOR()下也可以把
      

  13.   

    我觉得13楼说的对啊 , 你每次调用这个函数的时候 对象都要重新生成 自然不会保存原来table对象了
      

  14.   

    在Page_Load 里面加个if(!IsPostBack){}
      

  15.   

    你说得很正确,我后来仔细分析后,确实是你说的一样。
    Page_Load 中只有“CreateControlTR();”一行,没其他代码。
    具体什么原因,一直没查出来。昨天下午我已经换用记录次数 和 for{} 来搞定了。感谢你、huweiyufeng 和 其他热心的网友。