我想将一些动态文本框添加到表中并让它们触发事件。 我创建文本框或访问有关它们的信息没有问题,但他们不想触发事件。
List<string> txtNames = new List<string>();
txtNames.Add("txtId");
txtNames.Add("txtName");
txtNames.Add("txtQty");
txtNames.Add("txtUnitPrice");
txtNames.Add("txtExtendedPrice");
Panel1.Controls.Add(new LiteralControl("\t<tr>\n"));
TextBox txt;
foreach (string s in txtNames)
{
txt = new TextBox();
txt.CopyBaseAttributes(Textbox1);
txt.Text = "";
txt.BorderWidth = 0;
txt.ID = s + row;
Panel1.Controls.Add(new LiteralControl("\t\t<td>"));
Panel1.Controls.Add(txt);
Panel1.Controls.Add(new LiteralControl("</td>\n"));
txt.AutoPostBack = true;
txt.TextChanged += new EventHandler(txt_TextChanged);
txt.Text = s;
count++;
}
Panel1.Controls.Add(new LiteralControl("\t</tr>\n"));
row++;
(面板在html表中)
此代码位于未回发页面或单击按钮添加一行文本框时调用的函数。
文本框保存到会话中,然后在page_load上重新加载。
我尝试制作一个未在for循环中创建的测试文本框,并确实触发了文本更改事件。
修改: 我尝试从已保存的会话中加载文本框时重新添加文本更改事件,现在它们正在触发该功能。
答案 0 :(得分:1)
您应该在OnInit中放置方法调用而不是pageload,并且仅在不回发时设置Text属性
protected override void OnInit( EventArgs e)
{
base.OnInit(e);
int row = 0;
int count = 0;
List<string> txtNames = new List<string>();
txtNames.Add("txtId");
txtNames.Add("txtName");
txtNames.Add("txtQty");
txtNames.Add("txtUnitPrice");
txtNames.Add("txtExtendedPrice");
Panel1.Controls.Add(new LiteralControl("\t<tr>\n"));
TextBox txt;
foreach (string s in txtNames)
{
txt = new TextBox();
//txt.CopyBaseAttributes(Textbox1);
txt.BorderWidth = 0;
txt.ID = s + row;
Panel1.Controls.Add(new LiteralControl("\t\t<td>"));
Panel1.Controls.Add(txt);
Panel1.Controls.Add(new LiteralControl("</td>\n"));
txt.AutoPostBack = true;
txt.TextChanged += (sndr, evt) => { Response.Write(((Control)sndr).ID + " --- " + ((TextBox)sndr).Text); };
if(!IsPostBack)
txt.Text = s;
count++;
}
Panel1.Controls.Add(new LiteralControl("\t</tr>\n"));
row++;
}
答案 1 :(得分:0)
应在Page_Load中重新创建控件和事件,因为动态控件在请求后会丢失。