在代码中取消选择列表框项而不触发事件

本文关键字:事件 代码 取消 选择 列表 | 更新日期: 2023-09-27 18:35:34

我的C#窗体上有四个ListBox项。我想要的是一次只选择一个项目。也就是说,四个列表框控件中的任何一个项。

我知道您可以将 SelectedIndex 更改为 -1,这会取消选择当前选定的项目,这很棒。问题是事件触发。

所以我的四个列表框控件是 A、B、C 和 D。我在 A 上有一个 SelectedIndexChanged 事件,它将 B、C 和 D 的 SelectedIndex 设置为 -1。我在 B 上也有这样一个事件,它将 A、C 和 D 的 SelectedIndex 设置为 -1,依此类推。

我在 A 上选择一个项目,它将 B、C 和 D 的 SelectedIndex 调用为 -1。但是,这将调用他们的SelectedIndexChanged事件,该事件将所有其他事件(包括A)也设置为-1。如果我能在这么短的时间内阻止他们召集那个事件,那就太好了。

我希望有人可以提供一些帮助。谢谢。

在代码中取消选择列表框项而不触发事件

只需在事件中使用一些临时布尔变量...像这样:

bool _AChangingB = false;
void ListboxA_selectedIndexChangedDelegate(/* event parameters */)
{
  _AChangingB = true;
  ListboxB.SelectedIndex = -1;
  _AChangingB = false;
}
void ListboxB_selectedIndexChangedDelegate(/* event parameters */)
{
  if(!_AChangingB) 
    ListboxA.SelectedIndex = -1;
}   

如果您的事件是同步的,这样的事情应该可以工作(如果您正在异步,则需要更加小心)

另类

对于您的确切情况,您可以对所有四个列表框使用相同的函数,并通过 sender 参数进行区分:

bool _changing = false;
void Listboxes_selectedIndexChangedDelegate(object sender, /* blabla */)
{
  if(_changing) return;
  try
  {
    _changing = true;
    var allListBoxes = new ListBox[] { ListboxA, ListboxB, ListboxC, ListboxD };
    foreach(var listBox in allListBoxes)
      if(sender != listBox) 
        listBox.SelectedIndex = -1;
  } 
  finally 
  {
    _changing = false;  
  }
}

只是给出想法...这完全取决于您在列表框中实际需要哪些事件...很难用你提供的信息说