取消选择代码中的ListBox项而不触发事件

时间:2014-12-28 21:01:18

标签: c#

我的C#表单上有四个ListBox项。我想要的是任何时候只能选择一个项目。也就是说,在四个ListBox控件中的任何一个上都有一个项目。

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

所以我的四个ListBox控件是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。如果我能阻止他们在这么短的时间内召集这个活动,那就太棒了。

我希望有人能提供一些帮助。感谢。

1 个答案:

答案 0 :(得分: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;  
  }
}

只是提出想法......这一切都取决于你在列表框中实际需要的事件...很难说你给出的信息