0

ユーザーコントロールをプラグインのように機能させようとしています。ユーザーの選択から動的に(リフレクションを使用して)ロードします。ボタンをクリックすると、ユーザー コントロールが読み込まれたことを示すように UI が調整されていることがわかりますが、コントロール自体はできません。ビューステートも使用しましたが、それでもコントロールが表示されません。

以下の私のコードを見つけてください:

protected void Page_Load(object sender, EventArgs e)
    {
        //the scenario should be: a user clicking a button and from there, 
        //loads the control just below it, but still in the same page.
        if (Page.IsPostBack)
            LoadUserControl();

        //(a)I also tried to put in a ViewState but still nothing happens.
        //if (ViewState["UserControl"] != null)
        //{
        //    UserControl uc = (UserControl)ViewState["UserControl"];
        //    pnlReportControl.Controls.Add(LoadControl());
        //}

    }

//supposedly done after a button click
private void LoadUserControl()
    {
        enrolmentReports = string.Concat(Server.MapPath("~"), enrolmentDll);

        assembly = Assembly.LoadFrom(enrolmentReports);

        Type type = assembly.GetType("TZEnrollmentReports.EnrollmentUserControl");

        enrolmentMethodInfos = type.GetMethods();

        //also tried this way but also didn't work
        //Page.LoadControl(type, null);

        UserControl uc1 = (UserControl)LoadControl(type, null);

        pnlReportControl.Controls.Add(uc1);

        //(a)
        //ViewState["UserControl"] = uc1;
    }

助けてください。これは、複雑なプロセス全体の最初のステップにすぎません。そのレポートからデータセットを取得する必要があります。しかし、私はそれを別のスレッドに任せていると思います。

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

4

3 に答える 3

1

この問題を解決するのに役立つ提案は、アプローチを少し変更することです。通常、プラガブル システムを開発する場合、プラガビリティはいくつかのインターフェイスに基づいています。あなたの場合、カスタムコントロールによって内部的に管理されるデータを一般的な形式で取得するためのIPluginメソッドなどを定義するインターフェイスを作成します。CreateUI

このようにして、UserControl を適切に作成し、それを呼び出し元 (ページ) に返す責任をプラグイン実装 (カスタム コントロール) に委譲します。リフレクションを介してプラグイン実装をロードしたら(次のようなもの):

Assembly pluginDLL = Assembly.Load(System.IO.File.ReadAllBytes(fullPath));
Type pluginType = pluginDLL.GetType(step.PluginClass);
IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType);

次に、ページにコントロールをロードできます。

pnlReportControl.Controls.Add(plugin.CreateUI());
于 2012-05-18T10:14:44.223 に答える
1

LoadControl(Type, Object)これは、期待どおりの結果が返されない設計によるものだと思います。

使用するように変更するとLoadControl("PathOfControl")、これは機能するはずです。

詳細については、この SO Q&A を参照してください

于 2012-05-18T09:01:02.467 に答える