2010-06-23 78 views
3

我在窗体上有一堆控件,所有的“更改”事件都指向同一个事件处理程序。其中一些是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!"; 
    } 
} 

我想,如果当用户改变文本框的文本或点击复选框或任何声明,只运行。如果文本或复选框被程序的其他部分更改,我不希望发生这种情况。

+0

我可以发誓我刚刚回答了一个完全像这样的问题... – 2010-06-23 17:21:25

+1

这是它。它不完全重复,但答案仍然相同:http://stackoverflow.com/questions/3071811/listbox-selectedindexchanged-can-you-determine-if-it-was-user-intiated/3071856 – 2010-06-23 17:23:48

+0

Can当你声明“如果文本或复选框被程序的其他部分改变了,我不希望它发生”,那么你就澄清了你的意思。 – Doug 2010-06-23 17:24:07

回答

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; 
}); 
+0

谢谢,我只是假设有一个内置的机制来做到这一点。我会用一个标志。另外我在最后的代码块中学习了一些新的语法:) – Coder7862396 2010-06-23 17:43:54

+0

@Coder:它被称为lambda表达式。你应该找到关于它们的大量信息。祝你好运! – 2010-06-23 17:57:02

-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!"; 
    } 
} 
+0

这是不正确的。发件人总是提出事件的对象。无论“文本”属性是通过输入还是通过代码进行更改,“sender”变量将始终是引发事件的文本框的实例。 – 2010-06-23 17:40:06

+0

这不是从其他地方调用的“UpdatePreview()”,它是文本或复选框的设置(txtInput1.Text =“来自其他地方的Hello”) – Coder7862396 2010-06-23 17:43:06

+0

@Adam - 从回答发布的观点来看,这是不正确的题。我误解了他想要做的事情。在我发布的上下文中,我的回答是正确的。 @ Coder7862396 - 你是对的。我错过了原来的发帖。 – Robaticus 2010-06-23 21:42:28

相关问题