Как я узнаю, что мой контроль завершен, когда инициализируется? - PullRequest
1 голос
/ 18 февраля 2012

У меня есть элемент управления .NET, который пользователь может добавить в форму.

Visual Studio создает InitializeComponent, который вызывается из конструктора формы размещения:

public EditItemForm()
{
   InitializeComponent();
}

Этот автоматически сгенерированный метод в автоматически сгенерированном файле инициализирует мой элемент управления на основе правил сериализуемости дизайнера. e.g.:

private void InitializeComponent()
{
   ...
   this.lvResults = new Contoso.Controls.VirtualGrobber();
   ...

   // 
   // lvResults
   // 
   this.lvResults.BorderStyle = System.Windows.Forms.BorderStyle.None;
   ...

   //FrobGrobberForm
   ...
   this.Controls.Add(this.lvResults);
   ...
}

Как я, управляющий, сидящий на чьей-то форме, могу знать, когда все дизайнерские сериализации сделаны, и я "готов"?


В Delphi механизм, который сериализуется в элементе управления, автоматически вызывает метод Loaded каждого элемента управления:

Инициализирует элемент управления после его загрузки из потока.

procedure Loaded; override;

Описание

Потоковые системные вызовы VCL Loaded автоматически после загрузки формы элемента управления в память, чтобы элемент управления может выполнить любые инициализации, которые зависят от других объекты в форме.

Ответы [ 4 ]

2 голосов
/ 30 апреля 2012

Реализация интерфейса ISupportInitialize.Visual Studio добавит код в файл кода дизайнера форм, который вызывает EndInit, когда все настройки компонента будут выполнены.

1 голос
/ 18 февраля 2012

Если вы спросите о классе WinForms Control: вы можете переопределить метод Control.OnControlCreated. Другой вариант - переопределить метод Control.OnHandleCreated, который вызывается при создании базового графического объекта.

0 голосов
/ 19 февраля 2012

Если вы хотите, чтобы какой-то код выполнялся, когда Control "готов":

Если вы хотите, чтобы он выполнялся немедленно, когда Control «готов», даже до отображения формы: добавьте этот код после InitializeComponent(); в конструкторе формы. (Это просто метод, который создает Control и т. Д.)

Если вы хотите, чтобы он выполнялся при отображении формы, добавьте:

Shown += Form1_Shown;

В конструкторе формы и:

void Form1_Shown(object sender, EventArgs e)
{
    //code to execute.
}

В классе формы.

0 голосов
/ 18 февраля 2012

А также ... вы можете обнаружить его по ParentChanged событию

private void VirtualGrobber_ParentChanged(object sender, EventArgs e)
{
    try
    {
        Form frm = this.FindForm();
        if (frm != null && !frm.IsDisposed)
            frm.Load += new EventHandler(frm_Load);
    }
    catch (Exception ex)
    {
        //Do something
    }
}

private void frm_Load(object sender, EventArgs e)
{
    //Do what you want
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...