views:

916

answers:

3

I'm trying to create a custom server control (WebControl) with a text box.

I add asp.net textbox to the custom control in CreateChildControls override. In OnInit override I add event handler to TextBox.TextChanged.

Everything works, except that TextChanged never fires. I looked at viewstate and it looks like my textbox never saves its Text property in the viewstate. I've tried to set Text in various places, including constructor, but nothing works.

How can I get TextBox dynamically added to WebControl to save it's Text in viewstate and get TextChanged event to fire?

I would greatly appreciate an example of WebControl code behind with TextBox being added dynamically and TextChanged event being fired.

A: 

This will help you out. In short, you need to handle the viewstate for your Dynamically added control on your own.

rie819
+1  A: 

The dynamically created control must be created again in each post back, (the pageInit event is the better option) for the event to be fired.

BTW, if you want the TextChanged event to generate a postback you must also set the AutoPostback of the control to true.

tekBlues
It needs to be created, but the viewstate needs to be restored as well. If you don't manually handle the viewstate the page will treat it as a new control and no events will fire properly.
rie819
rie819, sorry, I have used dynamically created controls lots of time and never needed to take special care of the viewstate, has it something to do with databinding?
tekBlues
can you provide an example of Page code behind where you'd have TextChange event working?
Ornus
I don't want AutoPostback. postback happens when user clicks a separate button.
Ornus
+1  A: 

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

Ornus