No .NET, o Windows Forms tem um evento que é acionado antes do carregamento do Formulário (Form.Load), mas não há nenhum evento correspondente que é acionado APÓS o carregamento do formulário. Eu gostaria de executar alguma lógica após o carregamento do formulário.
Alguém pode aconselhar sobre uma solução?
Respostas:
Você pode usar o evento "Mostrado": MSDN - Form.Shown
"O evento Mostrado é gerado apenas na primeira vez que um formulário é exibido; subsequentemente, minimizar, maximizar, restaurar, ocultar, mostrar ou invalidar e repintar não aumentará esse evento."
fonte
Shown += Form1_Shown;
como sugerido em outro tópicoÀs vezes eu uso (no Load)
ou
(altere "this" para sua variável de formulário se você estiver manipulando o evento em uma instância diferente de "this").
Isso envia a chamada para o loop do Windows Forms, para que seja processada quando o formulário estiver processando a fila de mensagens.
[atualizado a pedido]
Os métodos Control.Invoke / Control.BeginInvoke destinam-se ao uso com threading e são um mecanismo para enviar trabalho para o thread da interface do usuário. Normalmente, isso é usado por threads de trabalho, etc. Control.Invoke faz uma chamada síncrona, enquanto Control.BeginInvoke faz uma chamada assíncrona.
Normalmente, eles seriam usados como:
Isso é feito empurrando uma mensagem para a fila de mensagens do Windows; o thread da interface do usuário (em algum momento) remove a fila da mensagem, processa o delegado e sinaliza ao trabalhador que ela foi concluída ... até agora tudo bem ;-p
ESTÁ BEM; então o que acontece se usarmos Control.Invoke / Control.BeginInvoke no thread da interface do usuário? Ele lida ... se você chamar Control.Invoke, é sensato o suficiente saber que o bloqueio na fila de mensagens causaria um impasse imediato - portanto, se você já estiver no thread da interface do usuário, ele simplesmente executará o código imediatamente ... não nos ajuda ...
Mas Control.BeginInvoke funciona de maneira diferente: ele sempre envia trabalho para a fila, mesmo que já estejamos no thread da interface do usuário. Isso faz uma maneira realmente simples de dizer "em um momento", mas sem a inconveniência de temporizadores, etc (que ainda precisariam fazer a mesma coisa!).
fonte
Na primeira vez que NÃO iniciará o "AfterLoading",
apenas o registrará para iniciar o NEXT Load.
fonte
Eu tive o mesmo problema e resolvi-o da seguinte maneira:
Na verdade, quero mostrar a mensagem e fechá-la automaticamente após 2 segundos. Para isso eu tive que gerar (dinamicamente) um formulário simples e um rótulo mostrando a mensagem, pare a mensagem por 1500 ms para que o usuário a leia. E Fechar formulário criado dinamicamente. Evento mostrado ocorrer Após o evento de carregamento. Então, o código é
fonte
Você também pode tentar colocar seu código no evento Ativado do formulário, se desejar que ele ocorra exatamente quando o formulário estiver ativado. Você precisaria colocar uma verificação booleana "executou", se ela deveria ser executada apenas na primeira ativação.
fonte
Essa é uma pergunta antiga e depende mais de quando você precisa iniciar suas rotinas. Como ninguém deseja uma exceção de referência nula, é sempre melhor procurar nulo primeiro e depois usar conforme necessário; só isso pode lhe poupar muita dor.
O motivo mais comum para esse tipo de pergunta é quando um contêiner ou tipo de controle personalizado tenta acessar propriedades inicializadas fora de uma classe personalizada em que essas propriedades ainda não foram inicializadas, causando potencialmente o preenchimento de valores nulos e pode até causar exceções de referência nulas em tipos de objetos. Isso significa que sua classe está sendo executada antes de ser totalmente inicializada - antes de concluir a configuração de suas propriedades etc. Outro possível motivo para esse tipo de pergunta é quando executar gráficos personalizados.
Para melhor responder à pergunta sobre quando iniciar a execução do código após o evento de carregamento de formulário, é necessário monitorar a mensagem WM_Paint ou conectar-se diretamente ao próprio evento de pintura. Por quê? O evento de pintura é acionado somente quando todos os módulos foram totalmente carregados em relação ao evento de carregamento de formulário. Nota: This.visible == true nem sempre é verdadeiro quando é definido como true, portanto não é utilizado para esse fim, exceto para ocultar um formulário.
A seguir, é apresentado um exemplo completo de como iniciar a execução do código após o evento de carregamento do formulário. É recomendável que você não amarre desnecessariamente o loop de mensagem de pintura, portanto, criaremos um evento que começará a executar seu código fora desse loop.
namespace MyProgramStartingPlaceExample {
}
fonte
Eu sei que este é um post antigo. Mas aqui está como eu fiz isso:
fonte
Você pode fechar seu formulário após alguma execução.
//YourForm.ActiveForm.Close ();
fonte