Dot-Net
如何防止值更改事件在 .NET 中的表單初始化時觸發?
考慮一個帶有幾個單選按鈕和一個複選框的簡單 .NET 表單。
每個單選按鈕都有一個 CheckedChanged 處理程序設置,它根據複選框的狀態執行一些操作。
我的問題是,當我初始化要檢查的預設單選按鈕(從設計器屬性視窗)時,會為該單選按鈕觸發 CheckedChanged 事件,但複選框尚未初始化,所以我要麼得到空指針異常,要麼處理程序中使用了錯誤的值。無論哪種方式,除非使用者在載入表單後選擇單選按鈕,否則我不希望執行該處理程式碼。
我目前通過不初始化單選按鈕來解決這個問題,但我最終需要設置該預設值,最好的地方是設計師。我還可以添加一個在表單完全載入之前未設置為 true 的布爾欄位,如果為 false 則不處理事件,但這是一個骯髒的 hack。
我能做些什麼來阻止該處理程序執行其程式碼?
“我還可以在表單完全載入之前放置一個未設置為 true 的布爾欄位,如果為 false 則不處理事件,但這是一個骯髒的 hack。”
這也是最簡單和最好的方法!
假設 .NET 提供了一種巧妙的方法來關閉和關閉所有事件處理程序,直到載入表單。即使只是您正在處理的那些。禁用您想要啟用的功能但禁用您沒有啟用的功能仍然不夠靈活。通常會發生表單設置,並且您希望觸發事件。如果沒有事件觸發,表單也不會正確建構。
為了讓它感覺不那麼臟,如果您在表單的建構子中初始化控制項,您可能能夠使用表單IsHandleCreated屬性而不是您自己的 bool 來檢查它是否應該實際驗證。
我認為通常你不想在第一次顯示之前驗證任何東西,並且直到它被創建才創建句柄。
程式碼範例:
Private Sub myRadioButton_CheckedChanged(sender As Object, e As EventArgs) Handles myRadioButton.CheckedChanged If myRadioButton.Checked AndAlso myRadioButton.IsHandleCreated Then 'Do Work End If End Sub