user1303481
user1303481

Reputation: 1

sharepoint webpart with many usercontrols

I have created sharepoint 2010 visual webpart in VisualStudio2010 with three user controls (.ascx). I want to dynamically change usercontrol in the webpart by clicking some button at currently loaded usercontrol. The main problem consist in the fact that buttonClick event is handled only after execution CreateChildControls method (where I try to get needed usercontrol using ViewData). Could anyone please help me to solve this problem?

Upvotes: 0

Views: 2350

Answers (3)

Pedro
Pedro

Reputation: 52

I had that problem too.

Add this to the event handler (after executing your code inside the handler)

this.Page.Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri, true);

Regards,

Pedro

Upvotes: 0

Ferdinand Prantl
Ferdinand Prantl

Reputation: 5709

Lee's response is basically right and may work well for you. However, you should not just use __doPostBack and rely that it will be always "magically" there for you. This method and variables mentioned by Lee are internal to ASP.NET and they are not meant to be used directly. Also, if you do not place any postback-ing control on your page this method will actually not be generated and your code calling it would fail.

Luckily, the code to cause and handle a generic postback is very simple. Instead of using built-in event handlers of input controls (which need to be constructed before being triggered - hence the call to CreateChildControls before your handler is called) you would target the postback to the Web Part itself:

public class MyWebPart : WebPart, IPostBackEventHandler {
    protected override void CreateChildControls() {
        Control clickable = ...; // Create a clickable control.
        // Get JavaScript expression to send postback "test" to "this" web part.
        var postBack = Page.ClientScript.GetPostBackEventReference(this, "test");
        clickable.Attributes["onclick"] = postBack + "; return false";
        Controls.Add(clickable);
    }

    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
        if (eventArgument == "test") { // Recognize and handle our postback.
           ...
        }
    }
}

The GetPostBackEventReference will generate the necessary JavaScript expression for you. (And actually, just calling it makes the __doPostBack "magically" appear on the page.) The RaisePostBackEvent will be called between OnLoad and OnPreRender. Make sure not to cause child controls be created before that (by calling EnsureChildControls, for example, or by any other means). If you need multiple postback-ing controls the eventArguments parameter will let you differ among them.

You need the postback triggers in your user controls and not directly in the Web Part. I showed it in the Web Part just to keep it simple. You can put the result of GetPostBackEventReference to any control providing you use the right Page and Web Part instances when calling it.

--- Ferda

Upvotes: 1

Lee Dale
Lee Dale

Reputation: 1196

A way to do this would be have the button call a javascript function that in turn calls the following:

__doPostBack('LoadControl', 'ControlName');

You can then use the server variables __EVENTTARGET and __EVENTARGUMENT to find out which control to load within your CreateChildControls event handler.

Upvotes: 0

Related Questions