2010-11-23 5 views
0

Lorsque vous appuyez sur F5 pour compiler un projet, il n'y a pas d'erreur ou d'avertissement, mais le formulaire n'apparaîtra pas. Quoi de neuf?VS 2010 Ultimate VB.NET Le formulaire de projet ne se compilera pas/n'apparaîtra pas

+0

Le code serait bien. – birryree

+0

Voici la source: http://www.mediafire.com/?5dpxo8otess2bmd Le problème est survenu après l'implémentation de la troisième forme, frmModifyStudent. Ce n'est pas encore terminé, c'est juste une partie copiée de la source d'autres parties du programme. – Liadc

Répondre

0

Dans le menu VS2010, allez dans Construire -> Gestionnaire de configuration, votre projet a-t-il activé la case à cocher dans la colonne "Construire"? Si le projet est mis à niveau à partir d'une ancienne version de Visual Studio, il se peut qu'il ne cible pas .NET Framework 4.0. Dans ce cas, vous devez le modifier comme expliqué here.

+0

Oui, c'est activé. Ajout du lien du code source par requête ci-dessus dans les commentaires. – Liadc

0

Pour analyser le problème, appuyez sur F8 (ou F10, selon vos paramètres de clavier par défaut) pour entrer dans le code au lieu d'exécuter l'application. Cela devrait vous conduire à la méthode principale où le formulaire principal serait initialisé.

+0

Ce sont les points saillants dans la ligne rouge 11 dans la forme principale. Je n'ai aucune idée pourquoi ce serait le problème. Le lien source est donné ci-dessus. – Liadc

+0

@Liadc: Que signifie exactement * sur * la ligne 11? Selon mon compte, c'est une ligne vide. –

1

Chaque fois que vous essayez d'exécuter votre code, il commence par créer une instance de frmMain, votre formulaire par défaut et celui affiché au démarrage de l'application.

Lorsque ce formulaire est créé, il instancie automatiquement une instance de Form3 parce que vous instancier une variable de ce type appelé modifyForm en haut du fichier de code de ce formulaire:

Dim modifyForm As New Form3 'modify student 

Le problème est que, lorsque le exécution va instancier un objet de type Form3, il est appelé retour à l'endroit où il était à cause de cette déclaration en haut du fichier de code Form3:

Dim frmMain As New frmMain 

Rincer, faire mousser et répéter. Votre code se transforme en une boucle infinie, en essayant d'instancier une instance de frmMain, qui essaie d'instancier une instance de Form3, qui essaie d'instancier une instance de frmMain, ad nauseum. Finalement, cela débordera votre mémoire disponible et provoquera un StackOverflowException.

Il est important de noter que tout cela se produit avant que l'instance par défaut de frmMain est même montré, parce que ces variables sont déclarées en dehors de toutes les méthodes dans votre code. Parce que l'ordinateur ne peut jamais échapper à cette boucle infinie, il n'a jamais une chance de se déplacer et d'afficher réellement votre formulaire.

Et le moment où vous avez tous lu patiemment pour: Fix en supprimant la déclaration de frmMain en haut du fichier de code Form3. Je ne sais pas ce que c'est là, de toute façon.


EDIT: Si tout va bien, je peux éclaircir un peu de confusion en ce qui concerne les valeurs de passage entre les formes. Après une étude plus approfondie de votre code, mon instinct me dit que la meilleure solution pour vous est de surcharger le constructeur pour Form3 pour accepter le formulaire appelant (l'instance existante instance de frmMain) comme argument. Cela vous permettra d'accéder à tous les membres du public de frmMain de au sein de votre classe Form3.

Voici une esquisse de la façon dont vous pourriez faire dans votre code:

Public Class frmMain 
    ''#The private data field that stores the shared data 
    Private _mySharedData As String = "This is the data I want to share across forms." 

    ''#A public property to expose your shared data 
    ''#that can be accessed by your Form3 object 
    Public Property MySharedData As String 
     Get 
     Return _mySharedData 
     End Get 
     Set(ByVal value As String) 
     _mySharedData = value 
     End Set 
    End Property 

    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     ''#Do all of your other stuff here... 


     ''#Create a new instance of Form3, specifying this form as its caller 
     Dim otherForm As New Form3(Me) 

     ''#Show the new instance of Form3 
     otherForm.Show() 
    End Sub 
End Class 


Public Class Form3 
    ''#The private field that holds the reference to the main form 
    ''#that you want to be able to access data from 
    Private myMainForm As frmMain 

    Public Sub New(ByVal callingForm As frmMain) 
     InitializeComponent() 

     ''#Save the reference to the calling form so you can use it later 
     myMainForm = callingForm 
    End Sub 

    Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     ''#Access anything that you need from the main form 
     MessageBox.Show(myMainForm.MySharedData) 
    End Sub 

End Class 

Comme vous pouvez le voir, frmMain expose une propriété publique (soutenu par une variable privée nommée de façon correspondante) appelée MySharedData. Cela peut être absolument n'importe quel vous voulez, et vous pouvez avoir autant de ceux-ci que vous le souhaitez.

Notez également que le constructeur (la méthode New) pour Form3 accepte une instance de frmMain en tant qu'argument. Chaque fois que vous créez un nouvel objet Form3 à partir de frmMain, il vous suffit de spécifier Me, ce qui indique que vous voulez passer l'instance actuelle de frmMain. Dans la méthode constructeur, Form3 stocke la référence à sa forme d'appel et vous pouvez utiliser cette référence à tout moment dans le code Form3 pour accéder aux propriétés publiques exposées par frmMain.

Questions connexes