Выполните код компонента перед или после события Form_load в .NET Winforms?

StackOverflow https://stackoverflow.com/questions/2265776

  •  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...");
    }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top