2016-08-09 11 views
0

Ich habe 2 Listboxen, die jeweils auf unterschiedlichen RegisterkarteSpiegel Auswahl von 2 listbox

listBox1 mit Elementen A, B, C und ListBox2 mit genau gleichen Einzelteile A, B, C

Wenn ich Artikel wählen Ein von listBox1 mag ich Artikel A von ListBox2 als gut ausgewählt und umgekehrt

ich benutze diesen Code:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 

      string item = listBox1.SelectedItem.ToString(); 
      int index = listBox2_Fichiers.FindString(item); 
      listBox2.SetSelected(index, true); 
} 
private void listBox2_SelectedIndexChanged(object sender, EventArgs e) 
     { 

      string item = listBox2.SelectedItem.ToString(); 
      int index = listBox1_Fichiers.FindString(item); 
      listBox1.SetSelected(index, true); 
} 

Es funktioniert nur in einer Art und Weise, von 1 bis 2 oder 2 bis 1, aber wenn Ich versuche Aktivieren Sie beide Ich bekomme diese Ausnahme: System.StackOverflowException

Was fehlt mir?

+0

Was passiert ist wahrscheinlich, dass Sie eine Endlosschleife haben, weil 'listBox1_SelectedIndexChanged'' listBox2_SelectedIndexChanged' aufrufen und umgekehrt. – smoksnes

Antwort

1

Es ist, weil jedes Mal, wenn Sie SetSelected aufrufen, kann SelectedIndexChanged aufgerufen werden.

Dies erstellt einen unendlichen Aufruf von listBox1.SetSelected > listBox1_SelectedIndexChanged > listBox2.SetSelected > listBox2_SelectedIndexChanged > listBox1.SetSelected > ....

Schließlich stoppt Sie das System, indem Sie StackOverflowException werfen.

private bool mirroring = false; 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (mirroring) return; 
    mirroring = true; 

    string item = listBox1.SelectedItem.ToString(); 
    int index = listBox2_Fichiers.FindString(item); 
    listBox2.SetSelected(index, true); 

    mirroring = false; 
} 
private void listBox2_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (mirroring) return; 
    mirroring = true; 

    string item = listBox2.SelectedItem.ToString(); 
    int index = listBox1_Fichiers.FindString(item); 
    listBox1.SetSelected(index, true); 

    mirroring = false; 
} 

Es liegt in Ihrer Verantwortung, die Anrufkette zu unterbrechen. Der einfachste Weg ist die Verwendung eines booleschen Schalters.

0
System.StackOverflowException 

Ausnahme tritt auf, wenn Sie versuchen, eine Schleife der Operation zu erstellen. Sie ändern list1 von list2s listBox2_SelectedIndexChanged Ereignis, so dass es den Index von list1 ändert, der das Ereignis listBox1_SelectedIndexChanged von fire list1 auslöst, das wiederum list2 wie zuvor auslöst. Also diese Sache, die eine Schleife des ausgewählten Indexänderungsereignisses verursacht und System.StackOverflowException exception geworfen wirft. Sie müssen diese Ereignisbehandlung ändern, um dies zu verhindern