Dot-Net
未為動態創建的控制項觸發事件處理程序
我在動態創建的 TextBox 中遇到了這個問題。
在 PageLoad 中創建 TextBox 時,會觸發它的 TextChanged 事件。
但是當我動態刪除並重新創建 TextBox 時,TextChanged 沒有被觸發。
這是程式碼:
.aspx 文件
<body> <form id="form1" runat="server"> <div> <asp:Table ID="Table1" runat="server"> <asp:TableRow> <asp:TableCell ColumnSpan="2">Fixed content</asp:TableCell> </asp:TableRow> </asp:Table> </form> </body>.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";