我有2个列表框,每个列表框都在不同的标签页上
listBox1,项目A,B,C和listBox2具有完全相同的项目A,B,C
当我从listBox1中选择项目A时,我希望从listBox2中选择项目A,反之亦然
我使用此代码:
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);
}
它仅以一种方式工作,从1到2或从2到1,但是当我尝试激活两者时,我得到此异常:System.StackOverflowException
我错过了什么?
答案 0 :(得分:1)
这是因为每次拨打SetSelected
时,都可以调用SelectedIndexChanged
。
这会创建listBox1.SetSelected > listBox1_SelectedIndexChanged > listBox2.SetSelected > listBox2_SelectedIndexChanged > listBox1.SetSelected > ...
的无限调用。
最终,系统会通过抛出StackOverflowException
来阻止您。
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;
}
您有责任打破调用链。最简单的方法是使用布尔开关。
答案 1 :(得分:0)
System.StackOverflowException
当您尝试创建操作循环时,会发生异常。您正在更改list2' listBox2_SelectedIndexChanged
事件中的list1,因此它会更改list1的索引,该列表会触发list1的listBox1_SelectedIndexChanged
事件,该事件再次触发list2与之前相同。所以这件事创建了一个选定的索引更改事件循环并抛出System.StackOverflowException exception
。您必须更改此事件处理以防止此