Dot-Net

未為動態創建的控制項觸發事件處理程序

  • June 16, 2017

我在動態創建的 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";

引用自:https://stackoverflow.com/questions/307737