如何确定用户操作或代码是否触发了事件?

时间:2010-06-23 17:18:17

标签: c# .net events

我在表单上有一堆控件,所有“更改”事件都指向同一个事件处理程序。其中一些是txtInput1的 TextChanged ,chkOption1的 CheckedChanged ,以及cmbStuff1的 SelectedIndexChanged 。这是事件处理程序:

private void UpdatePreview(object sender, EventArgs e)
{
    // TODO: Only proceed if event was fired due to a user's clicking/typing, not a programmatical set
    if (sender.IsSomethingThatTheUserDid) // .IsSomethingThatTheUserDid doesn't work
    {
        txtPreview.Text = "The user has changed one of the options!";
    }
}

我希望if语句仅在用户更改TextBox文本或单击复选框或其他内容时运行。如果文本或复选框被程序的其他部分更改,我不希望它发生。

2 个答案:

答案 0 :(得分:9)

没有内置机制来执行此操作。但是,您可以使用旗帜。

bool updatingUI = false;

private void UpdatePreview(object sender, EventArgs e)
{
    if (updatingUI) return;

    txtPreview.Text = "The user has changed one of the options!";
}

然后,当您从代码更新UI时:

updatingUI = true;

checkBox1.Checked = true;

updatingUI = false;

如果您想过度设计解决方案,可以使用以下内容:

private void UpdateUI(Action action)
{
    updatingUI = true;

    action();

    updatingUI = false;
}

并像这样使用它:

UpdateUI(()=>
{
    checkBox1.Checked = true;
});

答案 1 :(得分:-1)

你不能只检查寄件人吗?如果从有线事件调用它到UI控件,它将返回控件。如果您从代码中触发事件,它将是调用该组件的组件,或者您可以将其设为任意组件:

private void SomewhereElse()
{
   UpdatePreview(null, new EventArgs());
}

private void UpdatePreview(object sender, EventArgs e)
{
    if (sender == null) 
    {
        txtPreview.Text = "The user has changed one of the options!";
    }
}

或者您可以这样做:

private void UpdatePreview(object sender, EventArgs e)
{
    if (!(sender is Control)) 
    {
        txtPreview.Text = "The user has changed one of the options!";
    }
}