Windows窗体如何确定selectedindex是由用户还是代码更改的

时间:2010-11-19 02:05:47

标签: c# .net winforms

我在Windows窗体项目中有一个组合框,其中一个事件附加到selectedindex已更改事件。当从代码和用户输入更改selectedindex时,将触发事件。如何检测selectedindex是否因用户输入而发生变化?

4 个答案:

答案 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时,您都可以设置一个布尔标志,并且只要设置了该标志,处理程序就可以中止(重置标志)。