web-dev-qa-db-de.com

Form.Load-Ereignis wird nicht ausgelöst, Formular wird angezeigt

Ich befürchte, dass mit meinem Code offensichtlich etwas nicht stimmt, aber ich bin auf eine Situation gestoßen, in der das Form.Load-Ereignis nicht ausgelöst wird, wenn ich mein Formular erstelle und zeige. 

Das Formular ist nicht untergeordnet (da ich bei einigen Suchvorgängen einige Probleme festgestellt habe), und ich bekomme keine Fehler, wenn ich den Code im Debugger durchsehe.

Ich habe einen Haltepunkt für die von IDE erstellte Formularladefunktion (die das Signatur-Suffix Handles MyBase.Load hat) festgelegt, aber der Haltepunkt wird nie erreicht und das Formular wird angezeigt und funktioniert.

Dem Formular werden drei Argumente im Konstruktor übergeben, aber die Funktion IntializeComponent() wird aufgerufen, bevor etwas anderes ausgeführt wird.

Code:

Public Sub New(ByVal argA As Object, ByVal argB As Object, ByVal mode As FormMode)

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    ' Other code here,
    ' No errors generated
    '

End Sub

Die Formularladefunktion sieht wie folgt aus (diese wird jedoch nie ausgeführt, da das Ereignis nicht ausgelöst wird).

Code:

Private Sub frmInstrumentEditor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not argA Is Nothing Then ' argA set in constructor
          ' Operations using argA
    End If
End Sub

Ich kann hinzufügen, dass ich einige Datenbindungen mit einigen Steuerelementen und dem argA-Objekt verwende, aber wenn dies zu einem Fehler führte, dachte ich, ich hätte dies gesehen (ich habe CLR-Execpetions-Einstellungen im Debugger> Ausnahmenfenster auf Thown gesetzt.)

Irgendwelche Ideen, warum dies geschehen könnte?

16
ChrisAU

Ich hatte gerade ein ähnliches Problem (es war in Shown event, nicht Load, aber die Hauptursache ist dieselbe). Der Grund war tief in einem der Vorfahren verborgen - es wurde eine unbehandelte NullReferenceException geworfen und diese Ausnahme wurde irgendwie "stummgeschaltet".

Ich habe es nach ausgiebigem Debugging mit F11 gefunden. 

Aber ... als ich diese Antwort schrieb, fand ich diesen Beitrag auf SO

Fügen Sie einfach Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) in Ihre Main()-Methode ein.

Wenn Sie eine 64-Bit-Maschine verwenden, erhalten Sie die Lösung (in meinem Fall hat es auch funktioniert).

28

Ich hatte ein ähnliches Problem. Beim ersten Öffnen des Formulars würde das Ladeereignis nicht ausgelöst, aber beim zweiten Öffnen des Formulars wäre alles in Ordnung. Das Problem bestand aus einem meiner Textfelder, das an ein Feld gebunden war, das ich aus der Datenbank gelöscht hatte (SQL-Server - ich verwendete Datasets, Tableadaptors und Bindungsquellen auf ziemlich übliche Weise). 

Stellen Sie sicher, dass alle Steuerelemente in Ihrem Formular, die sich auf Datenbasis befinden, über Felder verfügen, die in der Datenmenge vorhanden sind, und dass die Datenmenge die zugrunde liegende Datenbanktabelle genau widerspiegelt wizzard "im Datenquellenfenster (Menü -data - Datenquellen anzeigen) und entfernen Sie die Tabelle. Verwenden Sie sie dann erneut, um die Tabelle wieder hinzuzufügen - dies sollte sicherstellen, dass alle Daten übereinstimmen.

Hoffe das hilft.

7
John Whiting

OK, ich hatte das gleiche Problem (glaube ich) und die Hinweise hier haben geholfen. Es war Datenbankarbeit (irgendwie)

Ich hatte Eigenschaften einiger Steuerelemente, die an Einstellungen gebunden waren. Wenn ich diese Einstellungen lösche, wurde das Formularladeereignis nicht mehr ausgeführt. Die Bindungen wurden entfernt und jetzt läuft es wieder.

4
polychromenz

Ich hatte ein ähnliches Problem, das Problem war ein Fehler in der Datenbindung. Lassen Sie den Code für die Datenbindung aus und probieren Sie es aus. Ich denke, der Load Event Handler wird getroffen. Dann sehen Sie, was mit dem Datenbindungsteil nicht stimmt.

1
Amr

Gelöst ....

Ich habe 4 Stunden verbracht und schließlich Hinweise aus diesen Antworten erhalten. In meinem Fall hatte ich ein Paar TextBox-Steuerelemente in dem an eine BindingSource gebundenen Formular mit der jeweiligen Spalte. Ich habe immer noch diese Bindungsquelle im Formular, aber was passiert ist dass ich eine Spalte aus der zugrundeliegenden Datenbanktabelle gelöscht habe, so dass in dem Formular immer noch eine TextBox vorhanden ist, die auf diese Spalte mit bindingsource verweist. In der Tat gibt es keine solche Spalte, da ich gelöscht habe! ..... dieses führende Form.load-Ereignis war nicht geschossen ........ endlich behoben ..

danke an euch alle .. 

1
Coder

Hatte das gleiche Problem. Überprüfte meine Datenbindungen, alles sah in Ordnung aus. Nachdenken, auch wenn Form geschlossen war, war .NET vielleicht nicht sicher (alte Zeiten, manchmal waren Formulare nur versteckt und nicht wirklich geschlossen).

Ich habe den Event-Handler FormClosed hinzugefügt und eine einzelne Zeile eingefügt:

Private Sub frmScheduleInquiry_FormClosed(sender As Object, e As   System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    Me.Dispose()
End Sub

Problem gelöst!

1
ccampj

Hier ist eine andere Idee.

Was passiert, wenn Sie alle Ausnahmetypen (nicht nur für die CLR) so einstellen, dass sie vom Benutzer nicht behandelt werden? Bricht die Anwendung irgendwo ab? 

Nur um zu überprüfen, sind Sie im Debug-Modus, richtig?

1
Matt

Vererbt Ihr Windows-Formular eine Basisseite? Wenn ja, hat die Basisseite wahrscheinlich auch einen Form Load-Ereignishandler. In dieser Basisseite des Form Load-Ereignishandlers finden Sie wahrscheinlich eine Ausnahme, die ausgelöst wird. Es wird also die Basisseite des Formular-Ereignis-Handlers für das Laden von Ereignissen beendet und nicht der Formular-Ereignis-Handler für das Formular in Ihrem geerbten Windows-Formular ausgelöst.

1
Bubba

Das Problem, das bei Ihnen auftritt, kann durch die Anwendung verursacht werden, die das Formular vollständig laden muss, bevor Sie den "anderen Code" ausführen können. Dies kann an dem anderen Code liegen, der sich auf Objekte im Formular bezieht, die noch nicht vollständig geladen wurden. Sie können einen Timer verwenden, der in der Ladefunktion aktiviert wird, um den anderen Code auszuführen. Auf diese Weise haben Sie keine Zeitprobleme und Sie können zuerst das Formular laden, und dann einen Sekundenbruchteil später den gewünschten Code mit dem Zeitgeber ausführen.

1
Matt

Ich hatte genau das gleiche Problem, das mir gerade passiert ist. Es stellte sich heraus, dass ich einige ApplicationsSettings-Eigenschaften zu einem Formular-TextBox-Steuerelement hinzugefügt hatte, sie jedoch später löschen wollte. Ich dachte Ich hatte alles geklärt, aber offensichtlich nicht - und dies führte dazu, dass Form_Load () (und möglicherweise auch andere Ereignisse) nicht ausgelöst wurden. Der Trick wurde durch Löschen und anschließendes Hinzufügen der fehlerhaften TextBox ausgeführt.

Hoffe das hilft

1
user3765883

Matt hat wahrscheinlich recht. Haben Sie versucht, Ihren Code so anzupassen:

Private Sub frmInstrumentEditor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not argA Is Nothing Then ' argA set in constructor
      ' Operations using argA
Else
      MessageBox.Show("argA has not been set")
End If
End Sub

Wenn das Meldungsfeld angezeigt wird, wird das Ereignis ausgelöst, bevor das Argument initialisiert wird. Dies würde auch das "seltsame" Verhalten beim Schließen/Öffnen des Formulars erklären.

Haben Sie versucht, die argA-Operationen im Ereignis 'Show' auszuführen?

0
Geoffrey

Ich weiß, dass dies ein alter Beitrag ist, aber ich dachte, wenn jemand dieses Problem durchsucht, könnte meine Lösung für dieses Problem hilfreich sein.

Ich hatte das gleiche Problem wie in der ursprünglich veröffentlichten Frage, aber ich hatte keine datengebundenen Felder im Formular. Ich stellte fest, dass das Problem in der Tatsache lag, dass ich die CurrentDeployment.CurrentVersion-Methode verwendete und das stille Problem verursachte. Ich habe die Anwendung aus dem Debug-Modus auf "Release" gesetzt und das Problem bestand immer noch. Durch Versuch und Irrtum habe ich die Definitionsmethode Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion Und presto ausgemerzt ... es funktioniert jetzt wie gewohnt. 

Am Ende habe ich den Originalcode geändert.

    Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
    sysVersion = String.Format("{0}.{1}{2}.{3}", xVersion.Major, xVersion.Minor, xVersion.Build, xVersion.Revision)

Neuer Code

#If (DEBUG) Then
    sysVersion = "[Debug mode]"
#Else
    Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
    sysVersion = String.Format("{0}.{1}{2}.{3}", xVersion.Major, xVersion.Minor, xVersion.Build, xVersion.Revision)
#End If

Ich hoffe, das hilft jemandem. Happy Coding ...

0
Lynn

Dieses Symptom ist beim Erstellen und Ausführen einer .NET 4.0-WinForms-Anwendung aufgetreten, mit der eine Reihe älterer Assemblys geladen wurden (.NET 2.0; .NET 1.1).

In der Vergangenheit hatte ich gesehen, dass dies eine Assembly-Ausnahme im gemischten Modus verursachte. In diesem Fall wird das Hauptformular ausnahmslos geladen, ohne dass der Form Load-Code ausgeführt wird.

In meinem Fall bestand die Lösung darin, useLegacyV2RuntimeActivationPolicy="true" im App.config-Dokument festzulegen.

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
0
El-Ahrairah

Stellen Sie sicher, dass im Feld "Lösungskonfiguration" oben in IDE "Debug" angezeigt wird. Ich habe festgestellt, dass die "Load" -Methode nicht erfasst wurde, wenn "Release" angezeigt wurde Debugger.

0
craisin

Nicht sicher, ob dies helfen wird, aber ich bin gerade auf dieses Problem gestoßen, weil jemand versehentlich das Handles Me.Load gelöscht hat. Ich sehe, dass Sie MyBase.Load zeigen. Versuchen Sie, es in Me.Load zu ändern. 

0
Hans

Dasselbe Problem, ich habe den Designer neu geschrieben und das wurde behoben. Der Designer wurde geladen und stürzte ab (natürlich leise), und form_load wurde aus diesem Grund nicht ausgelöst.

0
Rob

Hatte dasselbe Problem, aber die Ursache war völlig anders. Formular wurde mithilfe von form.Show () anstelle von form.ShowDialog () angezeigt.

0
syonip

Ich hatte ein ähnliches Problem. Es stellte sich heraus, dass ich die Show-Methode im Formular nicht verwendet habe - stattdessen benutzte ich einen user32.dll-ShowWindow-Aufruf. Das bedeutet, dass das Formular immer noch angezeigt wurde. Das Ereignis Load wurde jedoch nie ausgelöst, da die Methode dotNet Show nie aufgerufen wurde.

0
Nick Wallace