2012-05-16 2 views
0

Я пытаюсь сделать работу usercontrol как плагин: загружать его динамически (используя отражение) из пользовательского выбора. После того, как я нажму кнопку, я вижу, что пользовательский интерфейс был настроен так, что предположительно указывает, что пользовательский элемент управления загружен, но я не могу сам управлять. Я даже использовал viewstate, но все же я не вижу контроля.Динамически загруженный пользовательский элемент управления не отображается

Пожалуйста найти мой код ниже:

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; 
    } 

Пожалуйста, помогите. Это всего лишь первый шаг всего сложного процесса. Мне еще нужно получить набор данных из этого отчета. Но я думаю, что оставлю это в другой теме.

Спасибо!

+0

Если вы пытаетесь отлаживать ваш код, это 'uc1' правильно инстанцирован? Это пользовательский элемент управления, который вы ожидаете увидеть? – themarcuz

+0

фактически да. когда я пытаюсь отладить код, он показывает usercontrol, который я ожидаю, и все методы в нем. пользовательский интерфейс даже изменяется, чтобы соответствовать предполагаемой высоте пользовательского элемента управления. – iceheaven31

+1

Вы уверены, что проблема не в самом пользовательском управлении? возможно, он не может правильно создать html. Вы пытались загрузить его на странице жестко запрограммированным способом (так что не динамически загружались), чтобы убедиться, что он отображается правильно? – themarcuz

ответ

-2

попробуйте заменить следующий код в методе page_load

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

+1

Он говорит о показе элемента управления после нажатия кнопки, поэтому правильно оценить 'Page.IsPostBack'. Даже если я надеюсь, что это просто упрощённый пример, потому что я бы сделал это в обработчике событий click ... – themarcuz

1

Я считаю, что это дизайн с LoadControl(Type, Object), что он не возвращает то, что вы ожидали.

Если вы изменили его, чтобы использовать LoadControl("PathOfControl"), тогда это должно сработать.

Смотрите этот SO Q & А для получения дополнительной информации Dynamically Loading a UserControl with LoadControl Method (Type, object[])

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()); 
Смежные вопросы