Выполните код компонента перед или после события Form_load в .NET Winforms?
-
20-09-2019 - |
Вопрос
У меня есть компонент, который вступает в конфликт с другим компонентом, который обрабатывает некоторые внутренние переводы.
Что происходит, так это то, что компоненты бизнес -логики выполняются, затем система перевода выполняется, которая собирает тексты, которые теперь присутствуют в форме, и пытаются перевести их.
Проблема заключается в том, что в настоящее время текст содержит такие вещи, как числа, даты, текст, связанный с базой данных и т. Д., Но до того, как бизнес-логика была выполнена, эти элементы управления были либо пустыми, либо содержали фиктивное текст, подготовленный для перевода.
Мне интересно, как я могу иметь компонент, который я бросаю в форме, выполнять его код в определенное время в срок службы формы.
Например, если я удаляю код оскорбления из компонента бизнес -логики, чтобы он ничего не делал при строительстве, то переводчики, и если я позвоню методу, я переместил этот код из Form_load, это также работает хорошо.
Так что мне интересно, есть ли способ для меня, от компонента (т.е. Составная часть, не визуальный элемент управления), для выполнения кода перед или после Form_load, или, по крайней мере, после того, как были настроены все другие компоненты и элементы управления?
Похоже, что это не ссылка изнутри компонента обратно в форму, поэтому для меня, чтобы зацепить событие нагрузки, тоже не кажется возможным.
Или я лаю не то дерево?
Решение
Мне не ясно, почему вы не могли просто решить это, явно вызывая метод компонента из обработчика событий нагрузки формы.
Объяснить компонент о форме, на которой она сбрасывается, возможно. Дизайнер можно уговорить, чтобы инициализация свойства компонента в экземпляр формы. Например, это метод, используемый ErrorProvider, он рисует значки ошибки в форме. Это может быть расширено, чтобы позволить компоненту подписаться на событие загрузки формы. Вот пример:
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
public partial class Component1 : Component {
public Component1() {
InitializeComponent();
}
public Component1(IContainer container) {
container.Add(this);
InitializeComponent();
}
[Browsable(false)]
public ContainerControl Host {
get { return mHost; }
set {
if (mHost == null && value as Form != null && !DesignMode) {
(value as Form).Load += Initialize;
}
mHost = value;
}
}
private ContainerControl mHost;
public override ISite Site {
set {
base.Site = value;
if (value != null) {
// Assign Host at design time
IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (service != null) {
IComponent rootComponent = service.RootComponent;
this.Host = rootComponent as ContainerControl;
}
}
}
}
private void Initialize(object sender, EventArgs e) {
Console.WriteLine("initializing...");
}
}
}