Form_Load () ‘event’ ou Override OnLoad ()

Eu gostaria que alguém tentasse explicar a diferença entre eles. Mais especificamente, exemplo de cenário de uso.

Estou refatorando algum código de formulário do Windows e um Form tem algum código no evento Form_Load() e também em um evento protected override void OnLoad() que chama base.OnLoad(e); Agora eu o rastreei e o Override triggers primeiro e, em seguida, triggers imediatamente a versão do evento.

Então, qual é normalmente usado e por quê?

Você deve sempre replace OnLoad (). O uso do evento só é apropriado quando outra class estiver interessada no evento. Para que servem os events. Outra class interessada no evento Load é muito rara, apenas muito útil para fazer arranjos de janela.

Ainda assim, o evento Load funciona bem com o designer e os programadores VB6 estão muito confortáveis ​​com ele. Não é terrivelmente errado, você só se meteria em problemas quando você começa a herdar o formulário e o código não é executado na ordem correta.

A maioria dos códigos que agora são colocados no evento Load realmente pertence ao construtor. Você só precisa do OnLoad se:

  • Você precisa saber o tamanho exato e a posição da janela. OnLoad é melhor, a janela Handle é criada e as preferências do usuário são aplicadas (tamanho do título e da borda) e o formulário foi redimensionado conforme indicado pela propriedade Form.AutoScaleMode. A janela ainda não está visível, é um bom momento para mover a janela para outro local ou para organizar os controles secundários.
  • Você tem código que precisa da propriedade Handle. Isso é sutil, você não pode sempre dizer. Ter código como esse no construtor não é saudável, a janela é criada antes do construtor ser concluído. Geralmente chega a um bom final, mas pode tornar a criação da forma muito lenta. Fácil de diagnosticar a partir da janela Call Stack.
  • Para evitar um erro na implementação do MDI. Se você criar um filho MDI no construtor pai, obterá glifos duplicados, visíveis ao maximizar o filho. Crie o filho no OnLoad.

Ao replace OnLoad , a chamada para base.OnLoad chama o evento Load evento.

 protected override void OnLoad(EventArgs e) { // do stuff before Load-event is raised base.OnLoad(e); // do stuff after Load-event was raised } 

Se você não precisa especificamente executar algo antes do evento Load ser gerado, colocar o código em OnLoad depois de base.OnLoad(e) o mesmo comportamento em tempo de execução do posicionamento no manipulador de events Form_Load .

Eu recomendaria replace o método em vez de assinar o evento.

OnLoad gera o evento Load , que Form_Load manipula. Veja o artigo do MSDN .

Assim, no seu código, no final da sua function de boot, você poderia chamar a function OnLoad . A class base chamará seus manipuladores de events ( Form_Load , neste caso), que você pode ter definido em seu código de boot.

Pessoalmente, eu colocaria meu código no Form_Init e deixaria o OnLoad para iniciar o evento, já que estou lidando com o evento, embora você possa se defender com um bom motivo, como você pode ver pelas suas respostas.