从2列表框中选择镜像

时间:2016-08-09 10:12:58

标签: c# listbox

我有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

我错过了什么?

2 个答案:

答案 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。您必须更改此事件处理以防止此