从2列表框镜像选择
本文关键字:镜像 选择 列表 | 更新日期: 2023-09-27 18:01:22
我有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,但当我试图激活两者时,我得到这个异常:系统。StackOverflowException
我错过了什么
这是因为每次调用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;
}
打破呼叫链是你的责任。最简单的方法是使用布尔开关
System.StackOverflowException
当您试图创建操作循环时,会发生异常。您正在从list2的listBox2_SelectedIndexChanged
事件更改list1,因此它更改了list1的索引,该索引触发list1的listBox1_SelectedIndexChanged
事件,该事件再次触发list2与以前相同。这个东西创建了一个循环选定索引改变事件和抛出System.StackOverflowException exception
。您必须更改此事件处理以防止