2017-02-02 2 views
0

Ich bin eine App von VB.NET zu C# in WinForms-Anwendungen zu konvertieren.Eine nicht behandelte Ausnahme des Typs ‚System.StackOverflowException‘ aufgetreten in WTApp

Das Problem entstand, als ich erkennen, dass Sie nicht direkt andere Formen zugreifen können wie möglich in VB.NET zB:

Public Class frmMain 
    Private Sub Preferences_Click(sender... 
      frmPreferences.Show()           
    End Sub 
End Class 

So hatte ich einen Blick online und es schien, als ob ich ein erklären musste Verweis auf das Formular, bevor ich die Werte seiner Kontrollen ändern konnte. Also:


Ich habe jetzt zwei getrennte Formen. Ein frmPreferences genannt, die ohne die zusätzlichen Bits von Code wie folgt aussieht:

public partial class frmPreferences : Form 
    { 
     frmMain frmMain = new frmMain(); 
    } 


und die anderen, frmMain, nur die andere Form erklärt:

public partial class frmMain : Form 
    { 
     frmPreferences frmPreferences = new frmPreferences(); 
    } 

Der Call-Stack zeigt:

WTAppCSharp.exe! WTAppCSharp.frmMain.frmMain() Zeile 17 C#
WTAppCSharp.exe! WTAppCSharp.frmPreferences.frmPrefere nces() Linie 38 C#
WTAppCSharp.exe! WTAppCSharp.frmMain.frmMain() Zeile 17 C#
WTAppCSharp.exe! WTAppCSharp.frmPreferences.frmPreferences() Linie 38 C#
....

I bin nur nicht sicher, wie die Formulare korrekt zu verweisen, oder, was mache ich falsch :(

Hoffnung jemand helfen kann :)

+0

entfernen 'frmMain frmMain = new frmMain();' 'von frmPreferences' Konstruktor – vmeln

Antwort

1

Das Problem ist, dass Sie eine Endlosschleife erstellt haben. Ihre beiden Konstruktoren verweisen aufeinander. Sie können den Verweis aus frmPreferences entfernen oder den parameterlosen Konstruktor ganz loswerden.

public frmMain() 
    { //this is all you need. 
     frmPreferences frmPreferences = new frmPreferences(); 
     frmPreferences.Show(); 
    } 

Das es beheben und Pop die Einstellungen für Sie bilden. Ich würde alle Ihre Variablennamen ändern, um nicht den gleichen Namen und Fall wie die Klasse zu nennen, die sie aufrufen. Es wird bei der Fehlersuche Sinn machen, und Sie können Fehler von Intellisense bekommen, die sagen, dass Sie das sowieso nicht tun können.

Edit: Um genauer zu sein, durch Standardwerte auf Eigenschaften verwenden, die Sie anrufen, den parameterlosen Konstruktor für das andere Objekt in dieser Eigenschaft zu füllen. Wobei dann die Eigenschaft Ihres ersten Objekts aufgerufen wird, die dann die zweite erneut aufruft, und so weiter.

+0

Ja, aber ich brauche beide Formen für den Zugriff von jedem anderen so zu entfernen: ' frmMain frmMain = new frmMain(); '' von frmPreferences' würde mir Fehler geben wie: 'Eine Objektreferenz ist für das nicht statische Feld, Methode oder Eigenschaft "Control.Show" erforderlich. Der VB-Code an der Spitze ist nur ein Beispiel. Ich habe Code-Referenzierung in jeder entgegengesetzten Form. – Lewis

+0

http://i.cubeupload.com/ePStoI.png – Lewis

+0

Ok, ich habe es verstanden. Vielen Dank! – Lewis

Verwandte Themen