2012-02-17 5 views
1

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

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

public EditItemForm() 
{ 
    InitializeComponent(); 
} 

Это автоматически сгенерированный метод, в автоматически сгенерированный файл, инициализирует свой контроль на основе правил serializiblity дизайнера. например .:

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 потоковых системные вызовов Загруженный автоматически после того, как форма элемента управления загружаются в память, так что управление может завершить любую инициализацию, которые зависят от других объектов в форме.

+1

Существует несколько различных способов, которыми вы могли бы это сделать. Какой из них идиоматичен или соответствует действительности, зависит от того, что именно вы пытаетесь инициализировать.Конечно, дизайнер не делает ничего волшебного, это просто настройка свойств вашего контроля. И стандартное правило проектирования пользовательских элементов управления заключается в том, что свойства должны быть установлены в любом порядке, будь то пользователем или дизайнером. –

+3

Внедрение интерфейса ISupportInitialize. –

+0

@HansPassant i реализовал ISupportInitialize и поместил код в EndInit(), но он никогда не вызывался. Должна ли реализация ISupportInitialize что-то делать? Я забираю его обратно. После создания * дважды * дизайнер добавляет вызов 'EndInit()' во время 'InitializeComponent'. На самом деле должна фраза, что в форме ответа. –

ответ

1

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

1

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

0

А также ... Вы можете обнаружить его на 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 
} 
0

Предполагая, что вы хотите какой-то код, выполняемый, когда Control «готов»:

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

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

Shown += Form1_Shown; 

В конструкторе формы, а также:

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

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

Смежные вопросы