2012-03-30 13 views
0

Ich habe Sharepoint 2010 Visual Webpart in VisualStudio2010 mit drei Benutzersteuerelementen (ASCX) erstellt. Ich möchte Benutzersteuerung im Webpart dynamisch ändern, indem ich auf eine Schaltfläche bei der aktuell geladenen Benutzersteuerung klicke. Das Hauptproblem besteht in der Tatsache, dass das buttonClick-Ereignis erst nach der Ausführung der CreateChildControls-Methode behandelt wird (wobei ich versuche, die benötigte Benutzersteuerung mit ViewData zu erhalten). Könnte mir bitte jemand helfen, dieses Problem zu lösen?Sharepoint Webpart mit vielen Benutzersteuerelementen

Antwort

0

Ein Weg, dies zu tun, die Taste rufen Sie eine JavaScript-Funktion haben wäre, dass wiederum ruft die folgenden:

__doPostBack('LoadControl', 'ControlName'); 

Anschließend können Sie verwenden, um die Server-Variablen __EVENTTARGET und __EVENTARGUMENT um herauszufinden, welche innerhalb laden steuern Ihre CreateChildControls-Ereignisbehandlungsroutine.

1

Lee's Antwort ist grundsätzlich richtig und kann gut für Sie arbeiten. Sie sollten jedoch nicht einfach __doPostBack verwenden und darauf vertrauen, dass es immer "magisch" für Sie da sein wird. Diese Methode und die von Lee erwähnten Variablen sind ASP.NET-intern und sie sind nicht für die direkte Verwendung vorgesehen. Wenn Sie kein Postback-Steuerelement auf Ihrer Seite platzieren, wird diese Methode außerdem nicht generiert und Ihr Code, der es aufruft, würde fehlschlagen.

Zum Glück ist der Code, um ein generisches Postback zu verursachen und zu handhaben, sehr einfach. Stattdessen integrierte Ereignishandler der Eingabe der Verwendung von Kontrollen (die, bevor sie ausgelöst werden aufgebaut müssen - daher der Aufruf CreateChildControls vor Ihrem Handler genannt wird) würden Sie die Postback an den Web-Part-Ziel selbst:

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. 
      ... 
     } 
    } 
} 

Die GetPostBackEventReference generiert den notwendigen JavaScript-Ausdruck für Sie. (Und tatsächlich, rufen Sie einfach die __doPostBack "magisch" auf der Seite erscheinen.) Die RaisePostBackEvent wird zwischen OnLoad und OnPreRender aufgerufen werden. Stellen Sie sicher, dass davor keine untergeordneten Steuerelemente erstellt werden (z. B. durch Aufrufen von EnsureChildControls oder auf andere Weise). Wenn Sie mehrere Postback-Steuerelemente benötigen, können Sie unter dem Parameter eventArguments zwischen ihnen unterscheiden.

Sie benötigen die Postback-Trigger in Ihren Benutzersteuerelementen und nicht direkt im Webpart. Ich habe es im Webpart gezeigt, um es einfach zu halten. Sie können das Ergebnis GetPostBackEventReference in ein beliebiges Steuerelement einfügen, vorausgesetzt, Sie verwenden beim Aufruf die richtigen Seiten- und Webpart-Instanzen.

--- Ferda

0

ich auch dieses Problem hatte.

Fügen Sie diese auf der Event-Handler (nach dem Code innerhalb der Handler ausgeführt wird)

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

Grüße,

Pedro

Verwandte Themen