2009-10-01 15 views
9

Hey all!私は、Webメソッドを介してユーザーコントロールをロードし、そのようにLoadControl機能を使用しています:LoadControlとPage_Loadイベントは起動しません。

// create page, stringWriter 
Page _page = new Page(); 
StringWriter _writer = new StringWriter(); 

// get popup control 
Controls_Popup_ForumThreadForm _control = _page.LoadControl("~/Controls/Popup_ForumThreadForm.ascx") as Controls_Popup_ForumThreadForm; 

は、それから私は、次の手順を実行します

// add control to page 
_page.Controls.Add(_control); 

HttpContext.Current.Server.Execute(_page, _writer, false); 

問題は、コントロールのPage_Loadイベントが」doesnのことです火はまったくありません。別の関数を追加して、コントロールをページのControlsコレクションに追加する前に呼び出すと、その関数は起動しますが、Page_Loadイベントは発生しません。

アイデアは何ですか?皆さんありがとう!

+0

タグに** c#**と** Asp.Net **タグを追加して、読者を増やすことができます。 (そして、私は2歳のスレッドにコメントする前に投稿日付をチェックする必要があります。私は未回答の質問をブラウズしていました)。 –

答えて

1

チェックASP.NET Page Life Cycle Overview

PREINIT:開始段階の後に発生が完了し、初期化ステージが始まる前に。次のため

このイベントを使用:

Check the IsPostBack property to determine whether this is the first time the page is being processed. The IsCallback and IsCrossPagePostBack properties have also been set at this time. 

Create or re-create dynamic controls. 

Set a master page dynamically. 

Set the Theme property dynamically. 

Read or set profile property values. 
0

ページのライフサイクルのPREINIT段階でコントロールを追加します。私の知識に基づいて

var page = new Page(); 
var writer = new StringWriter();    
page.PreInit += new EventHandler((s, e) => 
{ 
    var control = page.LoadControl(""); 
    (Page)s).Controls.Add(control); 
}); 
HttpContext.Current.Server.Execute(page, writer, false); 
+0

このコードブロックはどこにありますか?それはpage_initにあるべきだと思う..それはライフサイクルの問題があるようだ... –

4

時にイベントを実行することはできません動的レンダリングコントロール。しかし、私は、動作するユーザーコントロールをレンダリングする際にはトリックを持っています。

私は、ユーザーコントロールの物理パスとプロパティのリストを取るユーザーコントロールをレンダリングする関数を使用します。私は、カスタムコントロールを実行するように設定したときに、メソッドのようになりうる特殊なプロパティをユーザーコントロールに定義します。これは機能レンダリングです:あなたは、たとえばプロパティを定義レンダリングする必要があるユーザーコントロールで

public static string RenderUserControl(string path, List<KeyValuePair<string, object>> properties) 
    { 
     Page pageHolder = new Page(); 
     UserControl viewControl = (UserControl)pageHolder.LoadControl(path); 
     viewControl.EnableViewState = false; 
     Type viewControlType = viewControl.GetType(); 
     foreach (var pair in properties) 
     { 
      PropertyInfo property = viewControlType.GetProperty(pair.Key); 
      if (property != null) 
      { 
       property.SetValue(viewControl, pair.Value, null); 
      } 
     } 
     HtmlForm f = new HtmlForm(); 

     f.Controls.Add(viewControl); 

     pageHolder.Controls.Add(f); 
     StringWriter output = new StringWriter(); 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return (output.ToString()); 
    } 

を、RunMyCode は、あなたが望む任意のプロパティを設定し、最後にユーザーが定義した特別なプロパティを追加します。ユーザーコントロールのレンダリングイベントで

data.Add(new KeyValuePair<string, object>("RunMyCode", SomeDataOrNothing)); 

、あなたはその後、RunMyCodeプロパティの値を確認することができますし、それが設定されていた場合、手動でイベントが正常に引き上げるメソッドを呼び出します。

+0

良い解決策は、答えとしてマークする必要があります!ありがとう! –

関連する問題