添加到动态文本框的动态事件未触发

本文关键字:动态 事件 文本 添加 | 更新日期: 2023-09-27 18:28:27

我想向表中添加一些动态文本框,并让它们触发一个事件。我创建文本框或访问有关它们的信息没有问题,但它们不想触发事件。

    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循环中创建的,它确实触发了文本更改事件。

编辑:当从保存的会话加载文本框时,我尝试重新添加文本更改事件,现在它们正在触发该功能。

添加到动态文本框的动态事件未触发

您应该将方法调用放在OnInit内部,而不是页面加载,并且只有在不返回时才设置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++;
    }

应该在Page_Load中重新创建控件和事件,因为动态控件在请求后会丢失。