C# 如何防止组合框在填充时触发另一个组合框的SelectedIndexChanged事件
所以,基本上我使用了一个ComboBox.SelectedIndexChanged事件来填充另外5个ComboBox,每个ComboBox都有自己的SelectedIndexChanged事件 问题在于,当第一个SelectedIndexChanged事件触发以填充其余事件时。。它还触发其他组合框的SelectedIndexChanged事件 为了防止出现这种情况,我找到了一个解决方案,它使用了在其余组合框上提交的事件SelectionChange 但是现在,与SelectedIndexChanged不同的事件不会在第一次单击组合框的项目时触发。。。您需要先选择该项两次或三次,然后再进行选择C# 如何防止组合框在填充时触发另一个组合框的SelectedIndexChanged事件,c#,wpf,combobox,ado.net,selectedindexchanged,C#,Wpf,Combobox,Ado.net,Selectedindexchanged,所以,基本上我使用了一个ComboBox.SelectedIndexChanged事件来填充另外5个ComboBox,每个ComboBox都有自己的SelectedIndexChanged事件 问题在于,当第一个SelectedIndexChanged事件触发以填充其余事件时。。它还触发其他组合框的SelectedIndexChanged事件 为了防止出现这种情况,我找到了一个解决方案,它使用了在其余组合框上提交的事件SelectionChange 但是现在,与SelectedIndexChan
所以,我的问题是:有没有办法解决这些问题?在代码中,在“填充”辅助组合框之前,先取消订阅SelectedIndexChanged事件,然后在“填充”代码运行后重新订阅。我将生成局部变量,并将其设置为应忽略SelectedIndexChanged的时间
protected bool ignoreSelectedIndexChanged = false;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (ignoreSelectedIndexChanged) { return; }
//rest of code
}
在我看来,这比摆弄事件更明确
在主组合框中,使用如下内容:
private void comboBoxMain_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
ignoreSelectedIndexChanged = true;
//comboBox1.SelectedIndex = 1;
//comboBox2.SelectedIndex = 2;
//comboBox3.SelectedIndex = 3;
//...
}
finally
{
ignoreSelectedIndexChanged = false;
}
}
SelectionChangedCommitted可能是另一种方法。但它仅在用户进行选择时触发,这在某些情况下可能会受到限制。还有一些圆屋顶的虫子在它应该开火的时候没有开火。我个人避免使用它。例如,使用标志
如果您只有2个组合框
这取决于您使用的组合框的数量。如果在启动父选择更改时,子组合框SelectedIndex属性更改为-1,则您可以解析出何时采取行动。我认为当未选择任何内容时,SelectedIndex将变为-1。因此,请忽略'Selectedindex=-1',谢谢你的回答,我确实觉得很有趣,你能给我举个例子吗?谢谢你的回答,在这种情况下,我应该忘记SelectionChangedCommitted事件,还是SelectedIndexChanged事件会起作用?@watchDogMan我添加了更多的解释,如果有帮助的话。它工作得很好,再次感谢,简单的解决方案,从来没有想到过
int flag =0;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
switch(flag)
{
case 0:
flag = 1;
break;
case 1:
// your code here
// after it you should set flag = 0
break;
default:
break;
}
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
switch(flag)
{
case 0:
flag = 2;
break;
case 2:
// your code here
// after it you should set flag = 0
break;
default:
break;
}
}