问题:
点“+新增”按钮很多次,最多只创建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();
}
点“+新增”按钮很多次,最多只创建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();
}
比如点击 4 次,生成的控件 id 就是这样:
第一行的是 YYDateTextBox3、YYDateCalendarExtender3、YYProLabel3;
第二行的是 YYDateTextBox4、YYDateCalendarExtender4、YYProLabel4。个人觉得是视图状态没有被记录,不能在当前视图状态的基础上再创建行。实在是不知道怎么解决。求助!!!
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostback){
CreateControlTR();
}
}
{
CreateControlTR();
}
{
if(!IsPostback){
CreateControlTR();
}
}
用了 if(!IsPostback),只能生成 1 行了。
TC1.Controls.Add(YYDateCalendarExtender1);
TC2.Controls.Add(YYDateTextBox2);
TR.Cells.Add(TC1);
TR.Cells.Add(TC2);因为你每一次调用的时候都是2行。
CreateControlTR();
}
首先page_load里面加!ispostback是不能省略的,如果你想在一个页面循环操作的话。”ViewState["CreateControlTR"] “的作用不是很明显,除了第一次进入页面时,会屏蔽Page_Load中的”CreateControlTR()“方法的操作。
而且我也没看出你在Page_Load方法中,写CreateControlTR()的作用。现在问题的表现症状是,每次点击按钮后,控件会在原本为空的表格中新增一行记录,(原来新增两行,是因为你在点击按钮,激活ViewState["CreateControlTR"] 后,Page_Load会新增一行,然后,新增按钮的委托方法会新增一行。),也就是你说的控件在每次新增后,没有记录自身的状态。
这种情况,你检查一下Page_Load方法中,是不是有”FormView1“的数据绑定操作,从而导致FormView1状态 被重置了。
问题很大情况出在Page_Load中。
Page_Load 中只有“CreateControlTR();”一行,没其他代码。
具体什么原因,一直没查出来。昨天下午我已经换用记录次数 和 for{} 来搞定了。感谢你、huweiyufeng 和 其他热心的网友。