2012-03-30 10 views
0

VisualStudio2010のsharepoint 2010 visual webpartを3つのユーザーコントロール(.ascx)で作成しました。現在ロードされているusercontrolのボタンをクリックすることでwebpartのusercontrolを動的に変更したいと思います。主な問題は、buttonClickイベントは、CreateChildControlsメソッドの実行後(ViewDataを使用して必要なusercontrolを取得しようとする)にのみ処理されるという事実にあります。誰もこの問題を解決するために私を助けてもらえますか?これを行うにはsharepoint webcontrol with many usercontrols

答えて

0

方法は、ボタンを順番に次を呼び出すことのJavaScript関数を呼び出す必要があり、次のようになります。

__doPostBack('LoadControl', 'ControlName'); 

あなたはその後、内にロードするように制御するかを調べるためにサーバー変数__EVENTTARGETと__EVENTARGUMENTを使用することができますCreateChildControlsイベントハンドラ。

1

リーの反応は基本的に正しいので、うまくいくかもしれません。しかし、あなたはただ__doPostBackを使用して、それが常にあなたのために "魔法のよう"になるということに頼るべきではありません。 Leeが指摘したこの方法と変数は、ASP.NETの内部であり、直接使用するためのものではありません。また、あなたのページにポストバッキングコントロールを置かない場合、このメソッドは実際にはでなく、が生成され、コードを呼び出すと失敗します。

幸いにも、一般的なポストバックを引き起こして処理するコードは非常に簡単です。

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

:あなたはWebパーツ自体にポストバックを標的とする - の代わりに(それゆえ、あなたのハンドラが呼び出される前にCreateChildControlsへの呼び出しにトリガされる前に構築する必要がある)入力コントロールの組み込みのイベントハンドラを使用しますGetPostBackEventReferenceは必要なJavaScript式を生成します。 (実際には、それを呼び出すだけで__doPostBackがページに「魔法のように」表示されます)。RaisePostBackEventOnLoadOnPreRenderの間で呼び出されます。それ以前に子コントロールを作成しないようにしてください(例えば、EnsureChildControlsなどを呼び出すなど)。複数のポストバック制御が必要な場合は、eventArgumentsパラメータを使用してパラメータを変更することができます。

ユーザーコントロールにはポストバックトリガが必要で、Webパーツには直接接続しないでください。私はそれを単純に保つためにWebパーツに示しました。 GetPostBackEventReferenceの結果は、呼び出し時に適切なページインスタンスとWebパーツインスタンスを使用することを条件として、任意のコントロールに配置できます。

---フェルダー

0

この問題もありました。

(ハンドラ内のコードを実行した後)イベントハンドラに

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

よろしく、

ペドロ

これを追加