我正在动态添加许多用户控件,这些控件都有一个文本框。当文本框中的文本发生更改时,我正在尝试触发事件。
我的代码是这样的:
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
文本更改后执行该功能?
答案 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加载的。