我有动态创建TextBox的问题.
在PageLoad中创建TextBox时,会触发TextChanged事件. 但是当我动态删除并重新创建TextBox时,TextChanged没有被触发.
这是代码:
.aspx文件
.cs文件
public partial class test : System.Web.UI.Page { string myText = "a"; protected void Page_Load(object sender, EventArgs e) { WriteRows(); } private void WriteRows() { TableRow tr = new TableRow(); TableCell tc = new TableCell(); TextBox txt = new TextBox(); txt.Text = myText; txt.TextChanged += new EventHandler(txt_TextChanged); // Assign event handler tc.Controls.Add(txt); tr.Controls.Add(tc); tc = new TableCell(); tc.Text = txt.Text; tr.Controls.Add(tc); Table1.Controls.AddAt(1, tr); } private void txt_TextChanged(object sender, EventArgs e) { myText = ((TextBox)sender).Text; RedrawTable(); // Delete the row (incl. the TextBox) and rewrite it } private void RedrawTable() { Table1.Controls.RemoveAt(1); WriteRows(); } }
有没有人有解决方案,以便始终触发事件?
ASP.NET通过匹配控件的ID和请求参数来完成事件处理.在您的情况下,在txtTextChanged()期间创建的TextBox将具有自动ID,因为您没有指定任何显式ID.该ID将在文本更改事件期间回发.
在页面加载事件之后,ASP.NET将尝试查找具有此类ID的控件以为其触发事件.显然,ASP.NET将无法找到匹配项,因为在Page_Load()期间创建的TextBox是不同的,并且具有不同的ID.
要解决此问题:为文本框指定显式ID:
TextBox txt = new TextBox(); txt.Text = myText; txt.ID = "txtBox";