1

我正在尝试使用文本框创建自定义服务器控件 (WebControl)。

我将 asp.net 文本框添加到 CreateChildControls 覆盖中的自定义控件。在 OnInit 覆盖中,我将事件处理程序添加到 TextBox.TextChanged。

一切正常,除了 TextChanged 永远不会触发。我查看了视图状态,看起来我的文本框从未将其 Text 属性保存在视图状态中。我试图在不同的地方设置文本,包括构造函数,但没有任何效果。

如何将 TextBox 动态添加到 WebControl 以将其 Text 保存在 viewstate 中并触发 TextChanged 事件?

我将不胜感激后面的 WebControl 代码示例,其中 TextBox 被动态添加并被触发 TextChanged 事件。

4

3 回答 3

1

fixed it. dynamic control must be created and added in Init event. It must be assigned an ID without special ASP.NET symbols ('$' or ':' inside custom ID will break things). All properties must be assigned after control is added to the controls tree.

here's a working example for Page codebehind:

private readonly TextBox _textBoxTest = new TextBox();

protected void Page_Init( object sender, EventArgs e )
{
    this.form1.Controls.Add( _textBoxTest ); 
    _textBoxTest.Text = "TestBoxTest";
    _textBoxTest.ID = "TestBoxTestId";
    _textBoxTest.TextChanged += this._textBoxTest_TextChanged;
}

void _textBoxTest_TextChanged( object sender, EventArgs e )
{
    _textBoxTest.Text = "Worked";
}

for WebControl place init code in OnInit override

于 2009-06-22T21:58:28.417 回答
1

必须在每次回发中再次创建动态创建的控件(pageInit 事件是更好的选择)才能触发事件。

顺便说一句,如果您希望 TextChanged 事件生成回发,您还必须将控件的 AutoPostback 设置为 true。

于 2009-06-22T19:16:24.487 回答
0

将帮助你。简而言之,您需要自己处理动态添加的控件的视图状态。

于 2009-06-22T19:11:37.677 回答