Dot-Net

如何防止值更改事件在 .NET 中的表單初始化時觸發?

  • June 30, 2010

考慮一個帶有幾個單選按鈕和一個複選框的簡單 .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

引用自:https://stackoverflow.com/questions/3150882