在代码中取消选择列表框项而不触发事件
本文关键字:事件 代码 取消 选择 列表 | 更新日期: 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;
}
}
只是给出想法...这完全取决于您在列表框中实际需要哪些事件...很难用你提供的信息说