2011-07-04 8 views
0

私はいくつかのサーバコントロールを別々のアセンブリに持っており、何らかの選択に応じてそれらのいずれかをページに動的にロードしたいと思います。しかし、コントロールのサーバー側のイベントが発生していないという問題があるようです。アセンブリとフックアップイベントからサーバコントロールをロードする

コントロールの形式は次のとおりです。

[ToolboxData("<{0}:MyPlugin runat=server></{0}:MyPlugin>")] 
public class MyPlugin : WebControl, PluginSystem.Interface.IMyPlugins 
{ 
    protected override void RenderContents(HtmlTextWriter output) 
    { 
     ... 
     _btn = new Button(); 
     _btn.ID = "btnSave"; 
     this.Controls.Add(_btn); 
     _btn.Click += new EventHandler(btn_Click); 
     _btn.RenderControl(output); 
    } 
    void btn_Click(object sender, EventArgs e) 
    { 
     //do something. This doesn't fire 
    } 
} 

コントロールは、そのアセンブリからロードされます。

public static IMyPlugins GetPlugin(string assembly, string type) 
    { 
     var t = Type.GetType(type + ", " + assembly); 
     IMyPlugins rtn = (IMyPlugins)Activator.CreateInstance(t); 

     rtn.Initialise(); 

     return rtn; 
    } 

コントロールでイベントが発生しますように、私はページに読み込まれたアセンブリを注入する方法は?それは可能ですか?

ありがとうございました!

答えて

0

ページのライフサイクルのコントロールが遅すぎます。 OnInitページイベントのサーバーサイドコントロールを追加するのが最善の策です。

ライフサイクルプロセスの概要についてはthis linkをご覧ください。コントロールは、ポストバックイベントの処理が発生するまでに作成する必要があります。 This seriesも本当に良いです。

ユーザーの選択に基づいて動的にページを変更することは、このためにお尻の痛みになる可能性があります。一緒に行くにはいくつかの選択肢があります。一番簡単な方法は、すべてのコントロールをOnInitに追加し、ユーザーが選択したことを知ったときにコントロールを削除することです。

本当に完全に動的で、ポストバックが処理されるまでレンダリングするコントロールがわからない場合は、ASP.NETのviewstate/postbackシステムから離れて自分でチェックする方が簡単です。 Form.Requestコレクションをチェックすることにより、いつでもページライフサイクルのあらゆる時点の値を得ることができます。

関連する問題