Reputation: 25181
As per the title, I have created a custom control.
On a certain button click event, this control is instantiated, then added to the page.
It is a dynamic control, with it's own button events.
In order for these button events to be triggered, the control must be drawn by the end of Page_Load
/ OnLoad
, in the subsequent page_load / onload lifecycle stage.
My problem is how do I persist this control? I cant store it in the Session
object because it contains non-serializable items.
Upvotes: 2
Views: 7066
Reputation: 9864
You should recreate dynamic controls on every postback. The best place to do that is method CreateChildControls
.
To add dynamically control after button click set in click handler some flag (persistent flag - so it should be in viewstate or in sessionstate) - it should indicate that on next page creation your control should be added to it. After this you should set ChildControlsCreated = false;
After this CreateChildControls are executed again and your control is created correctly and is persistent (till you not clear flag).
So it should be done in this way:
protected override void CreateChildControls()
{
base.CreateChildControls();
if (ViewState["AddControl"] == true)
{
Controls.Add(new MyControl() {Id = "someId" });
}
}
And btn handler
private void OnShowControlClick(object sender, EventArgs e)
{
ViewState["AddControl"] = true;
ChildControlsCreated = false;
}
Upvotes: 2
Reputation: 13285
As with all HTML pages, the control must be recreated on each page request. ASP.NET handles a lot of this 'under the hood' with mechanisms such as ViewState and Session.
If your control is not (or can't be) tracked by ViewState, then you need to handle this yourself.
I don't know how complex your control is, but as a starting point you may wish to read up on handling the CreateChildControls event here (MSDN)
Upvotes: 0
Reputation: 109027
Usually for dynamic controls, they will have to be added on every postback and also the events need to be wired up every time.
Upvotes: 3
Reputation: 17818
I believe all you need to do is recreate it with the same ID during pre init and the asp.net engine will populate it from the view state.
This is off the top of my head, so I might have the details off a bit.
Upvotes: 0