上一篇写的是点击加号自动生成一行,这篇做了一个改进,让TextBox失去焦点时,自动生成一行。同时满足:同一文本框再次触发或者同一行的文本框触发事件是不会生成多余的行。
效果如下:
createTr( )是根据 ViewState["tdNum"]动态生成控件的方法。动态生成的文本框控件时给添加一个OnChange事件。
protected void CreateTr(int i)
{
ViewState["tdNum"] = i;
TableRow row = new TableRow();
TableCell cell0 = new TableCell();
TextBox tb = new TextBox { ID = "txtName" + i + "", Width = Unit.Parse("60px"), AutoPostBack = true};
tb.TextChanged += new System.EventHandler(tb_OnChange);
cell0.Controls.Add(tb);
row.Cells.Add(cell0);
TableCell cell1 = new TableCell();
tb = new TextBox { ID = "txtMode" + i + "", Width = Unit.Parse("60px"), AutoPostBack = true };
tb.TextChanged += new System.EventHandler(tb_OnChange);
cell1.Controls.Add(tb);
。。。。。
row.Cells.Add(cell1); HolderTable.Rows.Add(row);
}
下面是该事件的方法:
protected void tb_OnChange(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
string name = tb.ID;
string num = name.Substring(name.Length-1, 1);
if (Convert.ToInt16(ViewState["tdNum"]) <= Convert.ToInt16(num))
{
CreateTr(Convert.ToInt16(num) + 1);
}
}
其中
if (Convert.ToInt16(ViewState["tdNum"]) <= Convert.ToInt16(num))
是要保证不会添加ID号重复的控件。
比如textName1触发了tb_OnChange事件,生成了ID后缀都是2的一行,txtMode1触发tb_OnChange事件时,又会生成ID后缀都是2的一行。导致ID号重复,会出错。
因为触发事件后传回服务器时,原来已动态加载的数据会全部丢失,所以要在pageLoad里重新加载一遍:
protected void Page_Load()
{
if (ViewState["tdNum"] == null)
{
ViewState["tdNum"] = 1;
}
int tdNum = Convert.ToInt16(ViewState["tdNum"]);
for (int i = 1; i <= tdNum; i++)
{
CreateTr(i);
}
}
This is all