событие загрузки не сработало в унаследованном пользовательском элементе управления, загруженном из другой сборки (Winforms) - PullRequest
2 голосов
/ 06 августа 2010

У меня есть приложение с плагиноподобной структурой.все формы приложения наследуются от базового UserControl:

public class BaseUserControl : UserControl
{
// some common properties and methods
//
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
}
}

и компилируются в разные сборки.

Когда я хочу показать форму, она проходит через эту последовательность:

assembly = Assembly.LoadFile(assemblypath);
.
.
frm = (BaseUserControl)assembly.CreateInstance(frmname);
.
.
SomeContainer.Controls.Add(frm);
MainScreen.Controls.Add(SomeContainer);

Общая структура этих форм:

public class TestForm : BaseUserControl {
    public TestForm(){InitializeComponent();}
    private void InitializeComponent(){
.
.
    this.Load += new System.EventHandler(this.TestForm_Load);
. 
   }
   private void TestForm_Load(object sender, EventArgs e){}

}

Проблема в том, что событие Load этих форм не запускается.

Другое поведение, я не понимаю, как, при установке точки останова на OnLoad в базовом классе, стек вызовов показывает, что вызывается из InitializeComponent.

Любые идеи о том, как решить эту проблему?

1 Ответ

3 голосов
/ 06 августа 2010

Вы безнадежно смешиваете условия Form и UserControl, затрудняя хороший ответ.Они очень разные звери, вы не можете превратить UC в форму.Это окно клиента, а не окно верхнего уровня.Я подозреваю, что это как-то связано с вашей проблемой, но общая диагностика состоит в том, что кто-то переопределяет OnLoad и не вызывает base.OnLoad ().

Да, OnLoad может вызываться из кода в InitializeComponent ().Это не очень полезно, поскольку OnLoad будет запущен до завершения конструктора, но это поддерживается.Это произойдет, когда вы коснетесь свойства, для которого требуется создать дескриптор.Стек вызовов должен показать вам, какое конкретное присваивание свойства сделало это, просто дважды щелкните строку в стеке вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...