2010-11-19 47 views
4

我在Windows Forms項目中有一個組合框,並且事件附加到selectedindex changed事件。當所選索引從代碼和用戶輸入兩者都改變​​時,事件將被觸發。如何檢測選定索引是否因用戶輸入而發生變化?Windows窗體如何找出selectedindex是否被用戶或代碼更改

+0

你能解釋你爲什麼要這樣做嗎?這看起來像是一個非常嚴重的封裝違反,使一個方法的行爲取決於稱爲它的方式。 – JohnFx 2010-11-19 02:10:21

+0

我想知道用戶什麼時候改變了一個值,而不是最初設置值的時候。 – 2010-11-29 20:09:30

回答

8

您可以使用SelectionChangeCommitted事件嗎?該SelectionChangeCommitted事件有一大敗筆:只有當用戶改變組合框中選擇

編輯

SelectionChangeCommitted提高,如果你使用F4打開下拉列表,然後鼠標選擇和使用Tab鍵轉到下一個控件,它不會觸發。

關於它的Connect有一個[已關閉和已刪除]的錯誤,建議使用DropDownClosed事件來捕捉這個錯誤的情況。

+0

+1我從來不知道這樣的事件,很好!我總是使用一個標誌來檢查它是否被用戶或編程改變。 – 2010-11-19 02:45:29

+0

我仍然有一個問題,確定SelectionChangeCommitted是由向上箭頭,空格鍵還是鼠標點擊造成的。我可以處理這些事件並使用'布爾'標誌,但這似乎很混亂。 – 2012-05-29 23:11:59

+0

在我的情況下似乎很成問題。我將依靠旗幟。謝謝你的信息 – JSON 2016-04-01 18:49:01

0

您的事件處理程序僅在用戶輸入後調用,而不是在代碼更改索引後調用。 要麼處理那種情況,要麼在那裏設置一個布爾標誌,表示它是用戶輸入,以便代碼的另一部分可以看到最後一次索引更改是由於用戶輸入引起的。

4

我已經陷入了UI更改傳播到模型之前的情況,然後Model更改傳播回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; 
    ... 
} 
+0

+1使用忽略標誌的好的和靈活的解決方案。很好的解決方法,如果你有很多值同時更新 – trailmax 2012-07-04 14:52:42

+0

我喜歡第二個解決方法。似乎很好地工作,並且不需要標誌! – JSON 2016-04-01 18:51:15

0

只要選定的索引被代碼改變,您就可以設置一個布爾標誌,並且只要該標誌被設置,處理程序就可以中止(重置標誌)。

相關問題