web-dev-qa-db-fra.com

Evénement Form.Load non déclenché, affichage du formulaire

Je crains qu'il y ait quelque chose qui ne va manifestement pas dans mon code, mais j'ai rencontré une situation où l'événement Form.Load ne se déclenche pas lorsque je crée et affiche mon formulaire. 

Le formulaire n'est pas sous-classé (comme cela a été le cas lors de certaines recherches) et aucune erreur ne survient lorsque je consulte le code dans le débogueur.

J'ai un point d'arrêt défini sur la fonction de chargement de formulaire créée par l'IDE (qui a le suffixe de signature Handles MyBase.Load) mais le point d'arrêt n'est jamais atteint et le formulaire s'affiche et fonctionne.

Le formulaire reçoit trois arguments dans le constructeur, mais la fonction IntializeComponent() est appelée avant toute opération.

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

La fonction de chargement de formulaire est la suivante (mais elle n’est jamais exécutée car l’événement n’est pas déclenché).

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

J'ajouterais que j'utilise certaines liaisons de données avec certains contrôles et l'objet argA, mais si cela produisait une erreur, je pensais que je l'aurais vu (les paramètres CLR Execpetions sont définis sur Thown dans la fenêtre du débogueur> exceptions)

Des idées pourquoi cela pourrait se produire?

16
ChrisAU

Je viens d'avoir un problème similaire (c'était dans l'événement Shown, pas Load, mais la cause première est la même). La raison était cachée au plus profond de l’un des ancêtres - une variable NullReferenceException non gérée a été lancée et cette exception a été en quelque sorte "désactivée".

Je l'ai trouvé après un débogage approfondi avec F11. 

Mais ... en écrivant cette réponse, j'ai trouvé ceci post sur SO

Ajoutez simplement Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) dans votre méthode Main().

Si vous utilisez un ordinateur 64 bits, il vous fournit la solution (cela a également fonctionné dans mon cas).

28
Marko Juvančič

J'avais un problème similaire. Lors de l’ouverture du formulaire pour la première fois, l’événement de chargement ne serait pas déclenché, mais lors de l’ouverture une deuxième fois, tout irait bien. Le problème réglé était une de mes zones de texte qui était liée à un champ que j'avais supprimé de la base de données (serveur SQL - j'utilisais des ensembles de données, des tableadaptors et des bindings de manière assez standard). 

Assurez-vous que tous les contrôles de votre formulaire qui sont liés aux données ont des champs qui existent dans le jeu de données et que le jeu de données est un reflet fidèle de la table de base de données sous-jacente (le plus simple était de faire ce dernier bit en utilisant "Configurer la source de données avec wizzard "dans la fenêtre des sources de données (menu -data - afficher les sources de données) et supprimer le tableau. Utilisez-le à nouveau pour ajouter le tableau en arrière. Cela devrait vous assurer que toutes les données correspondent.

J'espère que cela t'aides.

7
John Whiting

OK, j'ai eu le même problème (je pense) et les indices ici ont aidé. C'était une liaison de données (en quelque sorte)

J'avais des propriétés de certains contrôles liés aux paramètres et lorsque je supprime ces paramètres, l'événement de chargement de formulaire s'interrompt. Supprimé les liaisons et maintenant il est à nouveau en cours d'exécution.

4
polychromenz

J'ai eu un problème similaire, le problème était une erreur dans la liaison de données. Omettez le code pour la liaison de données et essayez-le. Je pense que le gestionnaire d'événements de chargement sera touché. Puis voyez ce qui ne va pas avec la partie liaison de données.

1
Amr

Résolu ....

J'ai passé 4 heures et enfin obtenu des indices à partir de cette réponse. Dans mon cas, j'avais quelques contrôles TextBox sur le formulaire lié à un BindingSource avec une colonne respective, il me reste toujours ce bindingsource sur le formulaire, mais que s'est-il passé? que j’ai supprimé une colonne de la table de base de données sous-jacente, de sorte que sur le formulaire, il reste encore une zone de texte pointant vers cette colonne avec bindingsource; en fait, il n’ya pas de colonne comme celle-ci car j’ai supprimé! pas de tir ........ enfin fixé ..

merci à tous .. 

1
Coder

Avait le même problème. Vérifié mes liaisons de données, tout avait l'air d'aller. Je devais penser, même si le formulaire était fermé, peut-être .NET n'était-il pas sûr (au bon vieux temps, parfois les formulaires étaient seulement cachés et pas vraiment fermés).

J'ai ajouté le gestionnaire d'événements FormClosed et mis une seule ligne dedans:

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

Problème résolu!

1
ccampj

Voici une autre idée.

Que se passe-t-il si vous définissez tous les types d'exception (pas seulement pour le CLR) pour être levés au lieu d'être gérés par l'utilisateur? Est-ce que l'application casse n'importe où? 

En outre, juste pour vérifier, vous êtes en mode débogage, n'est-ce pas?

1
Matt

Votre formulaire Windows hérite-t-il d'une page de base? Si tel est le cas, la page de base comporte probablement également un gestionnaire d'événements Form Load. Dans cette page de base, gestionnaire d'événements Form Load, vous trouverez probablement une exception générée. Donc, il quitte le gestionnaire d'événements de chargement de formulaire de page de base et ne déclenche pas le gestionnaire d'événements de chargement de formulaire dans votre formulaire Windows hérité.

1
Bubba

Le problème que vous rencontrez peut être dû au fait que l'application a besoin de charger complètement le formulaire avant de pouvoir effectuer le "autre code". Cela peut être dû au fait que l'autre code traite des objets du formulaire dont le chargement n'est pas terminé. Vous pouvez utiliser une minuterie activée dans la fonction de chargement pour exécuter l'autre code. De cette façon, vous n’aurez aucun problème de minutage et vous pourrez d’abord charger le formulaire, puis une fraction de seconde plus tard, exécuter le code que vous voulez depuis le minuteur.

1
Matt

J'ai eu exactement le même problème qui m'arrive. Il s'est avéré que j'avais ajouté des propriétés ApplicationsSettings à un contrôle de formulaire TextBox, mais que je voulais plus tard les supprimer. Je pensais j'avais tout effacé, mais évidemment je ne l'ai pas fait - et c'est ce qui a empêché le Form_Load () (et peut-être d'autres événements également) de ne pas se déclencher. Supprimer puis ré-ajouter la zone de texte incriminée a fait l'affaire.

J'espère que cela t'aides

1
user3765883

Matt a probablement raison à propos de celui-ci. Avez-vous essayé d'ajuster votre code comme ceci:

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

Si la boîte de message apparaît, cela signifie que l'événement est déclenché avant l'initialisation de votre argument. Cela expliquerait également le comportement "étrange" concernant la fermeture/ouverture du formulaire.

Avez-vous essayé d'exécuter les opérations argA dans l'événement 'Shown'?

0
Geoffrey

Je sais qu'il s'agit d'un ancien message, mais je pensais que si quelqu'un cherchait une solution à ce problème, la solution à ce problème pourrait être utile.

J'avais le même problème que celui indiqué dans la question initiale, mais je n'avais pas de champs liés aux données dans le formulaire. J'ai constaté que le problème tenait au fait que j'utilisais la méthode CurrentDeployment.CurrentVersion et que cela causait le problème de silence. J'ai défini l'application du mode débogage sur release et le problème existait toujours. Par essais et erreurs, j’ai remarqué la méthode de définition Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion Et tout de suite ... ça marche maintenant comme d’habitude. 

J'ai fini par changer le code d'origine du code ci-dessous.

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

Nouveau 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

J'espère que cela aidera quelqu'un. Happy Coding ...

0
Lynn

J'ai rencontré ce problème lors de la création et de l'exécution d'une application .NET 4.0 WinForms qui a chargé une série d'assemblys plus anciens (.NET 2.0; .NET 1.1).

Dans le passé, j'avais déjà vu cela causer une exception d'assemblage en mode mixte. Dans ce cas particulier, le formulaire principal chargé sans exception et sans exécuter aucun de ses codes de chargement de formulaire.

La solution, dans mon cas, a été de définir useLegacyV2RuntimeActivationPolicy="true" dans le document App.config.

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

Assurez-vous que la boîte de dialogue "Configuration de la solution" située en haut de votre IDE affiche "Débogage". J'ai constaté que s'il affichait "Release", la méthode "Load" n'était pas capturée par débogueur.

0
craisin

Je ne sais pas si cela va aider, mais je viens de rencontrer ce problème parce que quelqu'un a supprimé par erreur le Handles Me.Load. Je vois que vous montrez MyBase.Load, essayez de le changer en Me.Load. 

0
Hans

Même problème, j'ai réécrit le concepteur et cela a été corrigé. Le concepteur chargeait puis se plantait (silencieusement bien entendu), et form_load ne se déclenche pas pour cette raison.

0
Rob

Même problème, mais la cause était totalement différente. La forme était affichée à l'aide de formulaire.Show () au lieu de formulaire.ShowDialog ()

0
syonip

J'ai eu un problème similaire. Il s’est avéré que je n’utilisais pas la méthode Show du formulaire, mais plutôt un appel Show32 de user32.dll. Cela signifie que le formulaire est toujours apparu, mais l'événement Load n'a jamais été déclenché car la méthode dotNet Show n'a jamais été appelée.

0
Nick Wallace