【问题标题】:Dynamic events added to dynamic textboxes not triggering添加到动态文本框的动态事件未触发
【发布时间】:2012-04-04 00:25:55
【问题描述】:

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

    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 循环中创建的测试文本框,并且该文本框确实触发了文本更改事件。

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

【问题讨论】:

  • 上面的代码在哪里? Page_Load?
  • 它在一个函数中,当页面没有回发,或者当我点击一个按钮添加另一行文本框时调用。
  • 是否也保存并重新创建了有效的测试文本框?
  • 没有在每次页面加载事件中创建。

标签: c# asp.net events dynamic textbox


【解决方案1】:

你应该把你的方法调用放在 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++;

    }

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我将它们保存到会话中,然后在 Page_load 上重新加载它们
    • 我找到了所有的文本框,将它们保存到一个列表中,并将该列表保存到一个会话中。然后加载我只需获取该文本框列表并以几乎完全相同的方式将它们添加回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多