Execute o código do componente pouco antes ou depois do evento form_load no .net winforms?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Eu tenho um componente que está em conflito com outro componente que lida com algumas traduções internas.

O que acontece é que os componentes da lógica de negócios são executados, o sistema de tradução é executado, que capta textos agora presentes no formulário e tenta traduzi -los.

O problema é que o texto agora contém coisas como números, datas, texto relacionado ao banco de dados, etc. Mas antes que a lógica de negócios fosse executada, esses controles estavam em branco ou continham texto fictício preparado para tradução.

Estou me perguntando como posso ter um componente que eu caio em um formulário executar seu código em um momento específico durante a vida útil do formulário.

Por exemplo, se eu remover o código ofensivo do componente de lógica de negócios, para que ele não faça nada na construção, então o trabalho de tradução e, se eu ligar para o método, movei esse código para o form_load, isso também funciona bem.

Então, estou me perguntando, existe uma maneira de mim, de um componente (ou seja, descendente de Componente, não um controle visual), para executar o código pouco antes ou depois do formulário, ou pelo menos depois que todos os outros componentes e controles foram configurados?

Ele não parece ser nenhum link dentro do componente de volta ao formulário; portanto, para eu conectar o evento de carga também não parece possível.

Ou estou latindo na árvore errada?

Foi útil?

Solução

Não está claro para mim por que você não poderia apenas resolver isso chamando explicitamente o método de um componente do manipulador de eventos de carga do formulário.

É possível fazer com que um componente ciente do formulário em que seja descartado. O designer pode ser persuadido a inicializar uma propriedade do componente na instância do formulário. Esta é uma técnica usada pelo ErrorProvider, por exemplo, pinta os ícones de erro no formulário. Isso pode ser estendido para permitir que o componente se inscreva no evento de carga do formulário. Aqui está um exemplo:

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...");
    }
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top