动态添加的用户控件中的文本框上的TextChanged事件未触发

时间:2015-03-31 09:26:54

标签: c# asp.net

我正在动态添加许多用户控件,这些控件都有一个文本框。当文本框中的文本发生更改时,我正在尝试触发事件。

我的代码是这样的:

Default.aspx的:

<asp:Panel ID="pnlControls" runat="server"/>

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    MyControl control = (MyControl)LoadControl("Controls/MyControl.ascx");
    control.NameField = "Test Name";
    pnlControls.Controls.Add(control);
}

MyControl.ascx

<asp:TextBox ID="txtNameField" runat="server" OnTextChanged="txtNameField_TextChanged" AutoPostBack="true"/>

MyControl.ascx.cs

public string NameField;

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostback)
    {
        txtNameField.Text = NameField;
    }
}

protected void txtNameField_TextChanged(object sender, EventArgs e)
{
    NameField = txtNameField.Text;
}

这是代码的简化版本,其中包含使功能按要求工作所必需的所有相关部分(据我所知)

但是,永远不会执行txtNameField_TextChanged函数。如何在txtNameField文本更改后执行该功能?

4 个答案:

答案 0 :(得分:3)

尝试将ID分配给UserControl

MyControl control = (MyControl)LoadControl("Controls/MyControl.ascx");
control.ID = "MyUserControl";
control.NameField = "Test Name";
pnlControls.Controls.Add(control);

控件必须在回发时具有相同的ID才能触发事件或加载其视图状态。

另外,您不需要在事件中为您的字段指定txtNameField.Text。只需使用获取/设置txtNameField.Text的属性即可。然后你总是得到正确的值,它也会自动保留在回发中。

所以不要这样:

public string NameField;

protected void txtNameField_TextChanged(object sender, EventArgs e)
{
    NameField = txtNameField.Text;
}

此:

public string NameField 
{
    get
    {
        return txtNameField.Text;
    }
    // maybe you want to make it public
    private set 
    {
        txtNameField.Text = value;
    }
}

答案 1 :(得分:0)

您需要将txtNameField添加到textChanged-Event。

MyControl:

this.TextChanged += new EventHandler(txtNameField_TextChanged);

至少我认为这就是你要做的,因为我无法在你的代码中的任何地方看到这一行。

答案 2 :(得分:0)

我的猜测是,点击事件的绑定会丢失。请尝试在Page_Load之前动态添加您的控件,最好的位置是Page_Init,其他控件也可以初始化。 (此时页面中的所有其他控件实际上已初始化)

请检查ASP.NET Page Life Cycle Overview,其中明确指出应在preinit阶段添加动态控件。 here是指向您正在使用的LoadControl方法的链接,其中控件也是在代码示例的init阶段动态添加的。

答案 3 :(得分:0)

你可以试试吗?连接调试器进行测试。

我复制了你的代码&amp;执行,对我来说“OnTextChanged”事件正在解雇。 即使我已将文本框放在用户控件中,我也是按照proframically加载的。