10

みなさん!Web メソッドを介して UserControl をロードし、LoadControl 機能を次のように使用しています。

// 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 イベントがまったく発生しないことです。別の関数を追加して、コントロールをページの Controls コレクションに追加する前に呼び出すと、その関数は起動しますが、Page_Load イベントは起動しません。

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

4

3 に答える 3

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設定されている場合は、イベントが通常発生させるメソッドを手動で呼び出すことができます。

于 2011-05-14T18:56:21.520 に答える
1

ASP.NETページのライフサイクルの概要を確認してください

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.
于 2011-04-19T10:19:32.413 に答える
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);
于 2011-05-01T03:27:13.870 に答える