2010-06-23 42 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

相關問題