7

I have a problem with ViewState. I have an aspx page that has a treeview on the left and an UpdatePanel with an ASP.NET Panel inside on the right. It is in that inner Panel where I load and unload dynamically user controls. I use that update panel to load dynamically controls.

I also made a custom control for my user controls because I need to pass some values from page. On that constructor I use ViewState to store these values.

The first time I load the user control I call its constructor with parameters. When I reload that user control on each postback I use its normal constructor.

My problem is I the values I've stored on ViewState has become null on successive postback.

Update:

This is a piece of my user control:

public class MyUserControl : System.Web.UI.UserControl
{
private int PKId
{
    get { return ViewState["pkId"] as int; }
    set { ViewState["pkId"] = value; }
}

public MyUserControl(int pkId)
{
    this.PKId = pkId;
}

...
}

I'm following this article to load controls dynamically: http://msdn.microsoft.com/en-us/magazine/cc748662.aspx#id0070065.

Second Update:
I also set the same control ID when I load the user control at first time and on each reaload.

Maybe I can use another method to store these values like input hidden fields or Cache. I've choosen ViewState because I don't want to overload server with Session values for each user.

Third update:

I load the controls with this code:

System.Web.UI.UserControl baseControl = LoadControl(ucUrl) as System.Web.UI.UserControl;
if (baseControl != null)
{
    baseControl.ID = "DestinationUserControl";
    PanelDestination.Controls.Add(baseControl);
}

And reaload with this code:

DynamicControls.CreateDestination ud = this.LoadControl(TrackedUserControl) as DynamicControls.CreateDestination;
if (ud != null)
{
    ud.ID = "DestinationUserControl";
    PanelDestination.Controls.Add(ud);
}

What's happening?

4
  • Please provide some of the code that is doing this so we can have a better idea on what is happening. Commented Feb 12, 2010 at 16:05
  • Why are you typing it as UserControl in the initial load, and as CreateDestination in the re-load? Commented Feb 13, 2010 at 9:58
  • Btw, another way to do it would be to manually save the state of the control into ViewState (you can do this by overriding SaveViewState, or by transferring copying important state into the ViewState on PreRender). On postback, you can override LoadViewState and put the manually saved state into some class instance fields (or transferring state from ViewState to your dynamically-created control at the beginning of Load). Commented Feb 13, 2010 at 10:02
  • I'm going to use Session instead of ViewState. There is something releated to user controls loaded dynamically that make lost ViewState variables. Commented Feb 25, 2010 at 20:23

4 Answers 4

3

Try storing the control into a local variable once it's loaded/constructed before it's added to the control hierarchy. That allows the ViewState data to be mapped from and to the control. See "Rule 2" here http://chiragrdarji.wordpress.com/2009/05/20/maintain-viewstate-for-dynamic-controls-across-the-postback/.

Sign up to request clarification or add additional context in comments.

1 Comment

Maybe I don't understand your answer but I'm doing in that way like Rule 2. I updated my question with more details.
3

When are you loading the user control? This has to happen in the Init event if you want ViewState to be saved/restored.

2 Comments

The user control has some textbox. If they have some text it is restored correctly on postbacks. I'm reloading user control on Page_Load event. I'm following this article to load controls dynamically: msdn.microsoft.com/en-us/magazine/cc748662.aspx#id0070065
If that article says to load dynamic controls in Page_Load, it's just flat out wrong. This will work in some cases, but certainly not all, as you've discovered. ViewState restore happens before Page_Load, and that's why your variable is null. No simpler way to explain it.
0

Adding controls dynamically inside an UpdatePanel is such a bad idea. It generates so much problems.

If it is possible, move the dynamic control creation out of the UpdatePanel and I believe your problem will be solved.

1 Comment

I'm so sorry. I make a mistake. It is an UpdatePanel with an ASP.NET Panel inside. It is in that inner Panel where I load and unload dynamically user controls.
0

As Bryan mentioned, you should load your dynamic controls in Page_Init rather than Page_Load.

As this description of the Page Life Cycle explains, by the time the Page_Load event happens, the view state from the postback has already been processed (in PreLoad). If the controls haven't been reloaded yet, the view state has nowhere to go.

PreLoad:

Use this event if you need to perform processing on your page or control before the Load event.

Before the Page instance raises this event, it loads view state for itself and all controls, and then processes any postback data included with the Request instance.

4 Comments

Maybe I can use another method to store these values like input hidden fields or Cache. I've choosen ViewState because I don't want to overload server.
Controls can be dynamically added on postback in the Load event, at which time their lifecycle will "catch up" to the current event. See "Catch-up Events for Added Controls" here msdn.microsoft.com/en-us/library/ms178472.aspx, and Walkthrough #6 here codeproject.com/KB/aspnet/… (which excellently illustrates the difference in behavior before and after a control is added to the hierarchy).
@gWiz, while walkthrough #6 is interesting, depending on "catch-up" events is problematic at best. Even the walkthrough itself says "it is recommended that you add your dynamic controls during the “PreInit” or “Init” events". That's what I was suggesting to @VansFannel.
Don't use PreInit. I've had a bad experience with this... exactly like using Page_Load. And I'm not sure why. Init event is definitely the way to go.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.