2016-05-13 15 views
-2

Ich machte schnell ein Windows Forms-Projekt, das eine GUI aus verschiedenen Textfeldern mit Float-Werten lädt. Einige von ihnen haben bereits einen Wert initialisiert. Alle Textfelder müssen aktualisiert werden, nachdem eine von ihnen geändert wurde.Windows Forms Endlosschleife Ausnahme

public Form1() 
{ 
    InitializeComponent(); 
    initializeValues(); 
    calculateValues(); 
} 

public void initializeValues() 
{ 
//textboxes are filled/initialized with default float values 
} 

public void calculateValues() 
{ 
//here all textboxes are new calculated and updated 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    calculateValues(); 
} 

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    calculateValues(); 
} 

Problem: Als ich dieses Projekt durchführen, ist es mir eine Stackoverflow wirft die (Endlosschleife oder unendliche Rekursion) unhandeled ist. Ich denke es ist, weil während der calculateValues() Methode der Text der textBoxes geändert wird und dann die Eventhandler aktiviert werden. Das ist die unendliche Schleife :-(

Wie ich meinen Code Konstrukt oben zu ändern, um dies zu vermeiden

Dank

+1

Setzen Sie Haltepunkte, gehen Sie durch Ihren Code und Sie werden feststellen, dass Ihr Verdacht richtig ist. Einfach die Veranstaltung vorher abbestellen und nach der Änderung erneut abonnieren. – CodeCaster

+0

Setzen Sie Ihre IDE so, dass sie bricht, wenn eine Win32-Ausnahme ausgelöst wird. Sie werden den gesamten Callstack direkt vor sich haben und sofort verraten, warum Sie eine Endlosschleife/unendliche Rekursion haben. – IInspectable

Antwort

0

Sie sollten nicht mit und nennen? „InitializeValues ​​();“ (die Ursache für . die Endlosschleife)

eine erste Lösung zu setzen, die init Wert eines TextBox in InitializeComponent sein könnte:

myTextBox.text = myInitValue;

+0

Warum würde ein regulärer, nicht rekursiver Funktionsaufruf einen Stackoverflow oder eine Endlosschleife verursachen? Sie springen zu leicht zu Schlüssen. – IInspectable

0

Ich löste das Problem, indem ich das Ereignis zu "KeyPress" änderte. In diesem Fall wird das Ereignis nicht von der Methode selbst aktiviert. Keine unendlichen Schleifen mehr. Das Setzen von Haltepunkten und das Durchschreiten von Schritten haben mir geholfen, "den Fluss" zu verstehen. Danke CodeCaster.