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

我相信这是设计使然LoadControl(Type, Object),它不会返回您所期望的。

如果您将其更改为使用,LoadControl("PathOfControl")那么这应该可以工作。

有关更多信息,请参阅此 SO Q&A使用 LoadControl 方法动态加载用户控件(类型,对象 [])

于 2012-05-18T09:01:02.467 回答
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 回答
-2

尝试在您的 page_load 方法中替换以下代码

if (Page.IsPostBack) LoadUserControl();if (!Page.IsPostBack) LoadUserControl();

于 2012-05-16T10:10:13.533 回答