我在Windows Forms項目中有一個組合框,並且事件附加到selectedindex changed事件。當所選索引從代碼和用戶輸入兩者都改變時,事件將被觸發。如何檢測選定索引是否因用戶輸入而發生變化?Windows窗體如何找出selectedindex是否被用戶或代碼更改
回答
您可以使用SelectionChangeCommitted事件嗎?該SelectionChangeCommitted事件有一大敗筆:只有當用戶改變組合框中選擇
編輯
SelectionChangeCommitted提高,如果你使用F4打開下拉列表,然後鼠標選擇和使用Tab鍵轉到下一個控件,它不會觸發。
關於它的Connect有一個[已關閉和已刪除]的錯誤,建議使用
DropDownClosed
事件來捕捉這個錯誤的情況。
+1我從來不知道這樣的事件,很好!我總是使用一個標誌來檢查它是否被用戶或編程改變。 – 2010-11-19 02:45:29
我仍然有一個問題,確定SelectionChangeCommitted是由向上箭頭,空格鍵還是鼠標點擊造成的。我可以處理這些事件並使用'布爾'標誌,但這似乎很混亂。 – 2012-05-29 23:11:59
在我的情況下似乎很成問題。我將依靠旗幟。謝謝你的信息 – JSON 2016-04-01 18:49:01
您的事件處理程序僅在用戶輸入後調用,而不是在代碼更改索引後調用。 要麼處理那種情況,要麼在那裏設置一個布爾標誌,表示它是用戶輸入,以便代碼的另一部分可以看到最後一次索引更改是由於用戶輸入引起的。
我已經陷入了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;
...
}
只要選定的索引被代碼改變,您就可以設置一個布爾標誌,並且只要該標誌被設置,處理程序就可以中止(重置標誌)。
- 1. Windows窗體綁定問題:如何知道用戶是否已更改值
- 2. 如何知道Winforms上的用戶或代碼是否關閉了窗體?
- 3. 如何找出某些javascript代碼是否被實際使用?
- 4. 檢查代碼是否被更改
- 5. Windows窗體或WPF,代碼或不代碼
- 6. C#/ Windows窗體:窗體的代碼不被執行
- 7. Windows窗體控件不會被後面的代碼更新
- 8. 如何找出實體框架對象是否已更改?
- 9. 是否有替代WebBrowser的Windows窗體?
- 10. 如何更改Windows Phone用戶代理
- 11. Windows窗體設計器更改我的代碼
- 12. 如何查找標籤是否存在或不在Windows窗體面板
- 13. 如何找出這條記錄是否已被用戶看到
- 14. 如何確定表單是否已被用戶或代碼關閉?
- 15. 如何檢測Visual Studio中是否執行了C#Windows窗體代碼?
- 16. 使用C#Windows窗體管理代碼
- 17. 從VBA代碼打開.NET WPF窗口或Windows窗體
- 18. Django窗體更改密碼
- 19. 如何找出JTextArea是否被激活?
- 20. c#windows窗體顯示窗口cmd上的輸出代碼
- 21. Windows窗體設計器代碼修改用戶控件集合和對象
- 22. Javascript:檢查用戶是否對代碼段做了更改
- 23. 如何檢查EditText是否被更改?
- 24. 更改用戶運行Windows窗體程序
- 25. 如何找出是否冬眠是可用於Windows用戶(用C++)
- 26. 從Windows窗體應用程序退出代碼
- 27. 線程在Windows窗體中用代碼0退出
- 28. 如何找出文件是否被修改?
- 29. 如何縮短或更改此代碼?
- 30. 如何在每次SQL Server表更改時更新Windows窗體客戶端?
你能解釋你爲什麼要這樣做嗎?這看起來像是一個非常嚴重的封裝違反,使一個方法的行爲取決於稱爲它的方式。 – JohnFx 2010-11-19 02:10:21
我想知道用戶什麼時候改變了一個值,而不是最初設置值的時候。 – 2010-11-29 20:09:30