Dynamically Change User Control in ASP.Net

asp.netdynamic-controls

I'm trying to create a web page that will display an appropriate user control based on the selected value of a drop down list.

Basically the page layout is this:

Drop Down Selection
< User Control created based on drop down selection >

I have it half working… the controls are changing when the selection changes.
In OnInit(), I dynamically create the last selected control (whose value gets saved in session state because ViewState isn't available at OnInit).

When the drop down selection change occurs, I remove the old user control, and add a new one. The problem is: with the new control being added from the selection changed event, I'm not able to save changes from the user on the first postback. After the first post back, the selected control is created from OnInit instead of the Change event, and state is saved from then on, until the next selection change.

Here is the SelectionChanged method:

protected void SelectionChanged(object sender, EventArgs e)
{
    SelectedValue = int.Parse(DropDownList.SelectedValue);  //Store in Session
    Control userControl = GetSpecificUserControl(SelectedValue);
    PlaceHolder1.Controls.Clear();   // Remove old user control
    PlaceHolder1.Controls.Add(userControl);
}

Any changes made to the new control by the user after SelectionChanged happens are not saved on the following post back. However, subsequent postbacks do get saved. At that point, the control is getting created in OnInit().

Is there some way to force the correct post back and ViewState when the control changes? Is it possible to force a page reinitialization after the control is changed?

Best Answer

What you need to do is keep the last known value of the DropDownList in the Session. Then:

OnInit:

  • Create whatever control is indicated by the saved value in the session

SelectionChanged Event

  • Remove whatever you created during OnInit
  • Create and add new control based on new DropDownList selection
  • Save new DropDownList selection in session

This way, on the next postback after a change you are re-creating the control that ViewState expected to find, and so it's state will be restored.

Dynamic controls can be very finicky. Often it is easier to create all of the controls you might possible need and set their Visible properties to false. This way they don't render to the browser at all. Then set Visible to true for just the controls you need when you need them.

Related Topic