繁体   English   中英

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

[英]TextChanged event on textbox in dynamically added user control not firing

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

我的代码是这样的:

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文本更改时,如何使函数执行?

尝试为UserControl分配一个ID

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

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

txtNameField.Text ,您无需在事件txtNameField.Text分配给您的字段。 只需使用获取/设置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;
    }
}

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

MyControl:

this.TextChanged += new EventHandler(txtNameField_TextChanged);

至少我认为这是您正在尝试做的事情,因为在您的代码中的任何地方都看不到该行。

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

请检查ASP.NET页面生命周期概述 ,其中明确指出应在预初始化阶段添加动态控件。 这里是您正在使用的LoadControl方法的链接,该控件在代码示例的init阶段中也动态添加。

您能否尝试并测试附带的调试器。

我复制了您的代码并执行了,对我来说,“ OnTextChanged”事件正在触发。 甚至我已经将文本框放置在我以编程方式加载的用户控件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM