从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

我错过了什么

从2列表框镜像选择

这是因为每次调用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。您必须更改此事件处理以防止