In .NET gibt es in Windows Forms ein Ereignis, das ausgelöst wird, bevor das Formular geladen wird (Form.Load). Es gibt jedoch kein entsprechendes Ereignis, das nach dem Laden des Formulars ausgelöst wird. Ich möchte eine Logik ausführen, nachdem das Formular geladen wurde.
Kann jemand eine Lösung empfehlen?
Antworten:
Sie können das Ereignis "Angezeigt" verwenden: MSDN - Form.Shown
"Das angezeigte Ereignis wird nur beim ersten Anzeigen eines Formulars ausgelöst. Durch anschließendes Minimieren, Maximieren, Wiederherstellen, Ausblenden, Anzeigen oder Ungültigmachen und Neulackieren wird dieses Ereignis nicht ausgelöst."
quelle
Shown += Form1_Shown;
wie in einem anderen Thread vorgeschlagenIch benutze manchmal (in Load)
oder
(Ändern Sie "this" in Ihre Formularvariable, wenn Sie das Ereignis auf einer anderen Instanz als "this" behandeln.)
Dadurch wird der Aufruf in die Windows-Forms-Schleife verschoben, sodass er verarbeitet wird, wenn das Formular die Nachrichtenwarteschlange verarbeitet.
[auf Anfrage aktualisiert]
Die Control.Invoke / Control.BeginInvoke-Methoden sind für die Verwendung mit Threading vorgesehen und stellen einen Mechanismus dar, mit dem die Arbeit auf den UI-Thread übertragen werden kann. Normalerweise wird dies von Arbeitsthreads usw. verwendet. Control.Invoke führt einen synchronen Aufruf aus, während Control.BeginInvoke einen asynchronen Aufruf ausführt.
Normalerweise werden diese verwendet als:
Dazu wird eine Nachricht in die Windows-Nachrichtenwarteschlange verschoben. Der UI-Thread stellt die Nachricht (irgendwann) aus der Warteschlange, verarbeitet den Delegaten und signalisiert dem Worker, dass er abgeschlossen wurde ... soweit so gut ;-p
OK; Was passiert also, wenn wir Control.Invoke / Control.BeginInvoke für den UI-Thread verwenden? Es kommt zurecht ... wenn Sie Control.Invoke aufrufen, ist es vernünftig zu wissen, dass das Blockieren der Nachrichtenwarteschlange einen sofortigen Deadlock verursachen würde. Wenn Sie sich also bereits im UI-Thread befinden, wird der Code einfach sofort ausgeführt ... damit hilft uns nicht ...
Aber Control.BeginInvoke funktioniert anders: Es schiebt immer Arbeit in die Warteschlange, auch wenn wir uns bereits im UI-Thread befinden. Dies ist eine wirklich einfache Art, "in einem Moment" zu sagen, aber ohne die Unannehmlichkeiten von Timern usw. (die sowieso immer noch das Gleiche tun müssten!).
quelle
Beim ersten Start wird "AfterLoading" NICHT gestartet, sondern
nur registriert, um das nächste Laden zu starten.
quelle
Ich hatte das gleiche Problem und löste es wie folgt:
Eigentlich möchte ich Nachricht anzeigen und sie nach 2 Sekunden automatisch schließen. Dafür musste ich ein (dynamisch) einfaches Formular und ein Etikett mit der Nachricht erstellen. Die Nachricht für 1500 ms anhalten, damit der Benutzer sie lesen kann. Und Schließen Sie das dynamisch erstellte Formular. Das angezeigte Ereignis tritt nach dem Ladeereignis auf. Code ist also
quelle
Sie können auch versuchen, Ihren Code in das aktivierte Ereignis des Formulars einzufügen, wenn Sie möchten, dass es auftritt, sobald das Formular aktiviert ist. Sie müssten jedoch eine boolesche Prüfung "hat ausgeführt" durchführen, wenn diese nur bei der ersten Aktivierung ausgeführt werden soll.
quelle
Dies ist eine alte Frage und hängt mehr davon ab, wann Sie Ihre Routinen starten müssen. Da niemand eine Nullreferenzausnahme wünscht, ist es immer am besten, zuerst nach Null zu suchen und sie dann nach Bedarf zu verwenden. das allein kann dir viel Kummer ersparen.
Der häufigste Grund für diesen Fragetyp ist, wenn ein Container oder ein benutzerdefinierter Steuerelementtyp versucht, auf Eigenschaften zuzugreifen, die außerhalb einer benutzerdefinierten Klasse initialisiert wurden, in der diese Eigenschaften noch nicht initialisiert wurden. Dies kann möglicherweise dazu führen, dass Nullwerte ausgefüllt werden, und kann sogar Nullreferenzausnahmen verursachen auf Objekttypen. Dies bedeutet, dass Ihre Klasse ausgeführt wird, bevor sie vollständig initialisiert ist - bevor Sie Ihre Eigenschaften usw. festgelegt haben. Ein weiterer möglicher Grund für diese Art von Frage ist, wann benutzerdefinierte Grafiken ausgeführt werden müssen.
Um die Frage zu beantworten, wann nach dem Laden des Formulars mit der Ausführung von Code begonnen werden soll, müssen Sie die WM_Paint-Nachricht überwachen oder sich direkt an das Paint-Ereignis selbst anschließen. Warum? Das Malereignis wird nur ausgelöst, wenn alle Module in Bezug auf Ihr Formularladeereignis vollständig geladen wurden. Hinweis: This.visible == true ist nicht immer true, wenn es auf true gesetzt ist. Daher wird es für diesen Zweck überhaupt nicht verwendet, außer um ein Formular auszublenden.
Im Folgenden finden Sie ein vollständiges Beispiel dafür, wie Sie nach dem Laden des Formulars mit der Ausführung Ihres Codes beginnen. Es wird empfohlen, die Paint-Message-Schleife nicht unnötig zu binden, damit ein Ereignis erstellt wird, mit dem Ihr Code außerhalb dieser Schleife ausgeführt wird.
Namespace MyProgramStartingPlaceExample {
}}
quelle
Ich weiß, dass dies ein alter Beitrag ist. Aber so habe ich es gemacht:
quelle
Sie können Ihr Formular nach einiger Ausführung schließen.
//YourForm.ActiveForm.Close ();
quelle