【问题标题】:How to ignore overselect in listbox如何忽略列表框中的过度选择
【发布时间】:2016-03-11 18:04:17
【问题描述】:

目前我有 6 个列表框。我试图选择与手动选择的同一行中的所有其他 5 个列表框项目。

但是,我得到一个错误:

“System.StackOverflowException”类型的未处理异常 发生在 System.Windows.Forms.dll 中

无法计算表达式,因为当前线程在堆栈中 溢出状态。

下面是其中一个列表框的代码示例,对所有其他列表框重复。

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {

      listBox1.SelectedIndexChanged=1;
        listBox3.SelectedIndex = -1;
        listBox2.SelectedIndex = -1;
        listBox4.SelectedIndex = -1;
        listBox5.SelectedIndex = -1;
        listBox6.SelectedIndex = -1;
        listBox2.ClearSelected();
       listBox3.ClearSelected();
       listBox4.ClearSelected();
       listBox5.ClearSelected();
       listBox6.ClearSelected();
       int  a = listBox1.SelectedIndex;
       int b = listBox2.SelectedIndex;
       int c = listBox3.SelectedIndex;
       int d = listBox4.SelectedIndex;
       int f = listBox5.SelectedIndex;
       int g = listBox6.SelectedIndex;


        if (a >-1)
        {
           // listBox1.SetSelected(a,true);
            listBox2.SetSelected(a, true);
            listBox3.SetSelected(a, true);
            listBox4.SetSelected(a, true);
            listBox5.SetSelected(a, true);
            listBox6.SetSelected(a, true);
        }
        else if (b > -1)
        {
            listBox1.SetSelected(b, true);
           // listBox2.SetSelected(b, true);
            listBox3.SetSelected(b, true);
            listBox4.SetSelected(b, true);
            listBox5.SetSelected(b, true);
            listBox6.SetSelected(b, true);
        }
        else if (c > -1)
        {
            listBox1.SetSelected(c, true);
            listBox2.SetSelected(c, true);
         //   listBox3.SetSelected(c, true);
            listBox4.SetSelected(c, true);
            listBox5.SetSelected(c, true);
            listBox6.SetSelected(c, true);
        }
        else if (d > -1)
        {
            listBox1.SetSelected(d, true);
            listBox2.SetSelected(d, true);
            listBox3.SetSelected(d, true);
          //  listBox4.SetSelected(d, true);
            listBox5.SetSelected(d, true);
            listBox6.SetSelected(d, true);
        }
        else if (f > -1)
        {
            listBox1.SetSelected(f, true);
            listBox2.SetSelected(f, true);
            listBox3.SetSelected(f, true);
            listBox4.SetSelected(f, true);
           // listBox5.SetSelected(f, true);
            listBox6.SetSelected(f, true);
        }
        else if (g > -1)
        {
            listBox1.SetSelected(g, true);
            listBox2.SetSelected(g, true);
            listBox3.SetSelected(g, true);
            listBox4.SetSelected(g, true);
            listBox5.SetSelected(g, true);
           // listBox6.SetSelected(g, true);
        }


    }


    private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        listBox1.SelectedIndex = -1;
        listBox3.SelectedIndex = -1;
        listBox4.SelectedIndex = -1;
        listBox5.SelectedIndex = -1;
        listBox6.SelectedIndex = -1;
        listBox1.ClearSelected();
        listBox3.ClearSelected();
        listBox4.ClearSelected();
        listBox5.ClearSelected();
        listBox6.ClearSelected();
        int a = listBox1.SelectedIndex;
        int b = listBox2.SelectedIndex;
        int c = listBox3.SelectedIndex;
        int d = listBox4.SelectedIndex;
        int f = listBox5.SelectedIndex;
        int g = listBox6.SelectedIndex;


        if (a > -1)
        {
            // listBox1.SetSelected(a,true);
            listBox2.SetSelected(a, true);
            listBox3.SetSelected(a, true);
            listBox4.SetSelected(a, true);
            listBox5.SetSelected(a, true);
            listBox6.SetSelected(a, true);
        }
        else if (b > -1)
        {
            listBox1.SetSelected(b, true);
            // listBox2.SetSelected(b, true);
            listBox3.SetSelected(b, true);
            listBox4.SetSelected(b, true);
            listBox5.SetSelected(b, true);
            listBox6.SetSelected(b, true);
        }
        else if (c > -1)
        {
            listBox1.SetSelected(c, true);
            listBox2.SetSelected(c, true);
            //   listBox3.SetSelected(c, true);
            listBox4.SetSelected(c, true);
            listBox5.SetSelected(c, true);
            listBox6.SetSelected(c, true);
        }
        else if (d > -1)
        {
            listBox1.SetSelected(d, true);
            listBox2.SetSelected(d, true);
            listBox3.SetSelected(d, true);
            //  listBox4.SetSelected(d, true);
            listBox5.SetSelected(d, true);
            listBox6.SetSelected(d, true);
        }
        else if (f > -1)
        {
            listBox1.SetSelected(f, true);
            listBox2.SetSelected(f, true);
            listBox3.SetSelected(f, true);
            listBox4.SetSelected(f, true);
            // listBox5.SetSelected(f, true);
            listBox6.SetSelected(f, true);
        }
        else if (g > -1)
        {
            listBox1.SetSelected(g, true);
            listBox2.SetSelected(g, true);
            listBox3.SetSelected(g, true);
            listBox4.SetSelected(g, true);
            listBox5.SetSelected(g, true);
            // listBox6.SetSelected(g, true);
        }

}

【问题讨论】:

  • 永远不要使用空的 Try-Catch。 a + 1 > 0a > -1 的另一种说法吗?
  • 您是否只有 listBox2 触发了在 listBox2_SelectedIndexChanged 中处理的 SelectedIndexChanged 事件?
  • @LarsTech 你是对的。谢谢!
  • @skalinkin 对不起,我的英语不强,但如果我明白你的意思,答案是肯定的。请通过答案部分查看我的完整代码。谢谢

标签: c# listbox


【解决方案1】:

您的代码可能正在更改代码中某处的 SelectedIndexChanged 事件中的索引。

尝试改用标志:

listBox1.SelectedIndexChanged += listBox_SelectedIndexChanged;
listBox2.SelectedIndexChanged += listBox_SelectedIndexChanged;
listBox3.SelectedIndexChanged += listBox_SelectedIndexChanged;

bool changingSelection = false;

void listBox_SelectedIndexChanged(object sender, EventArgs e) {
  if (!changingSelection) {
    int index = ((ListBox)sender).SelectedIndex;
    if (index > -1) {
      changingSelection = true;
      listBox1.SetSelected(index, true);
      listBox2.SetSelected(index, true);
      listBox3.SetSelected(index, true);
      changingSelection = false;
    }
  }
}

【讨论】:

  • 嗨。抱歉,我是编程新手,所以我仍在试图弄清楚你的代码中发生了什么。感谢您的帮助。
  • @Adrian 对我的示例有任何不明白的地方,请随时问我。
  • 当然。 listBox1.SelectedIndexChanged += listBox_SelectedIndexChanged; listBox2.SelectedIndexChanged += listBox_SelectedIndexChanged; listBox3.SelectedIndexChanged += listBox_SelectedIndexChanged;这是做什么的?
  • flag 和 FlagsAttribute 一样吗?这是什么意思/做什么?
  • 该标志只是指一个布尔变量:changeingSelection。当它为真时,它会忽略 if 块内的代码,因为当您更改 ListBox 的选择时,它总是会触发此代码。 listBox1.SelectedindexChange += 东西将事件分配给方法。这是一种手动连接事件的方法,而不是使用设计器。我指定每个 ListBox 使用相同的方法。通常你只分配一次事件,最好是在表单的构造函数中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多