我在Windows窗体项目中有一个组合框,其中一个事件附加到selectedindex已更改事件。当从代码和用户输入更改selectedindex时,将触发事件。如何检测selectedindex是否因用户输入而发生变化?
答案 0 :(得分:8)
您可以使用SelectionChangeCommitted事件吗?
仅当用户更改组合框选择
时才会引发SelectionChangeCommitted
编辑:SelectionChangeCommitted事件有一个重大失败:如果您使用F4下拉列表然后将鼠标悬停在您的选择上并使用Tab键转到下一个控件,它不会触发。
Connect上有关于它的[已关闭且已删除]错误,建议使用DropDownClosed
事件来捕获此角色案例。
答案 1 :(得分:5)
在UI更改传播到模型之前,我已经陷入困境,然后模型更改传播回UI并创建无限循环。你在处理类似的事情吗?
如果是这样,一种方法是仅在模型不同时才从模型更新UI。那就是:
if (comboBox.SelectedItem != newValue)
comboBox.SelectedItem = newValue;
如果这不能满足您的需求,另一个选择是临时删除事件处理程序:
comboBox.SelectedIndexChanged -= this.comboBox_SelectedIndexChanged;
comboBox.SelectedIndex = newIndex;
comboBox.SelectedIndexChanged += this.comboBox_SelectedIndexChanged;
或指示处理程序忽略此事件:
ignoreComboBoxEvents = true;
comboBox.SelectedIndex = newIndex;
ignoreComboBoxEvents = false;
...
public void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (ignoreComboBoxEvents)
return;
...
}
答案 2 :(得分:0)
您的事件处理程序仅在用户输入后调用,而不是在代码更改索引之后调用。 要么处理那个案例,要么在那里设置一个布尔标志,说它是用户输入,以便代码的另一部分可以看到最后一个索引更改是由于用户输入。
答案 3 :(得分:0)
每当代码更改selectedindex时,您都可以设置一个布尔标志,并且只要设置了该标志,处理程序就可以中止(重置标志)。