Рассмотрите простую форму.NET с несколькими переключателями и флажком.
Каждый из переключателей имеет установку обработчика CheckedChanged, которая выполняет некоторое действие на основе состояния флажка.
Моя проблема, когда я инициализирую на переключателе по умолчанию, который будет проверен (от окна свойств разработчика), событие CheckedChanged уволено за тот переключатель, но Флажок еще не был инициализирован так я или добирается, исключение нулевого указателя или неправильное значение используются в обработчике. Так или иначе я не хочу, чтобы тот код обработчика был выполнен, если пользователь не выбирает переключатель после того, как форма была загружена.
Я в настоящее время обхожу это, не инициализируя переключатель, но я должен установить то значение по умолчанию в конечном счете, и лучшее место от разработчика. Я также могу добавить булево поле, это не установлено на истинный, пока форма полностью не загружается, и не обрабатывают события, если это - ложь, но это - грязный взлом.
Что я могу сделать, чтобы препятствовать тому, чтобы тот обработчик выполнил свой код?
"Я также могу поместить булево поле, которое не устанавливается в true до полной загрузки формы, и не обрабатывать события, если это false, но это грязный хак."
Это также самый простой и лучший способ сделать это!
Допустим, .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
Простое решение - объявить инициализирующую переменную:
Private Initializing as boolean = True
Private Sub rb_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbNuevos.CheckedChanged, RbDesaparecidos.CheckedChanged, RbModificados.CheckedChanged, RbNoDesap.CheckedChanged, RbDesHoy.CheckedChanged, RbChT.CheckedChanged
if Initializing then return
'Your Code
End Sub
Public Sub New()
' Llamada necesaria para el Diseñador de Windows Forms.
InitializeComponent()
' Agregue cualquier inicialización después de la llamada a InitializeComponent().
initializing = false
end sub
Самое сложное: AddHandler
на новом методе.
Public Sub New()
' Llamada necesaria para el Diseñador de Windows Forms.
InitializeComponent()
' Agregue cualquier inicialización después de la llamada a InitializeComponent().
AddHandler RbChT.CheckedChanged, AddressOf rb_CheckedChanged
end sub