我的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。如果我能阻止他们在这么短的时间内召集这个活动,那就太棒了。
我希望有人能提供一些帮助。感谢。
答案 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;
}
}
只是提出想法......这一切都取决于你在列表框中实际需要的事件...很难说你给出的信息