Выполнить код компонента непосредственно перед или после события Form_Load в .NET WinForms? - PullRequest
1 голос
/ 15 февраля 2010

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

В результате запускаются компоненты бизнес-логики, затем выполняется система перевода, которая подбирает тексты, присутствующие в форме, и пытается их перевести.

Проблема в том, что текст теперь содержит такие вещи, как числа, даты, текст, связанный с базой данных, и т. Д., Но до того, как бизнес-логика была выполнена, эти элементы управления были либо пустыми, либо содержали фиктивный текст, подготовленный для перевода.

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

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

Так что мне интересно, есть ли способ для меня, из компонента (т.е. произошедшего от Компонент , а не визуальный элемент управления), выполнить код непосредственно перед или после Form_Load, или, по крайней мере, после того, как все другие компоненты и элементы управления были установлены?

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

Или я лаю не на том дереве?

1 Ответ

2 голосов
/ 15 февраля 2010

Мне не понятно, почему вы не можете просто решить эту проблему, явно вызвав метод компонента из обработчика события Load формы.

Возможно ознакомление компонента с формой, в которой он отброшен. Конструктор можно уговорить инициализировать свойство компонента для экземпляра формы. Это метод, используемый ErrorProvider, например, он рисует значки ошибок на форме. Затем это можно расширить, чтобы позволить компоненту подписаться на событие Load формы. Вот пример:

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...");
    }
  }
}
...