То, как предотвратить значение, изменило события от стрельбы в инициализацию формы в.NET?

Рассмотрите простую форму.NET с несколькими переключателями и флажком.

Каждый из переключателей имеет установку обработчика CheckedChanged, которая выполняет некоторое действие на основе состояния флажка.

Моя проблема, когда я инициализирую на переключателе по умолчанию, который будет проверен (от окна свойств разработчика), событие CheckedChanged уволено за тот переключатель, но Флажок еще не был инициализирован так я или добирается, исключение нулевого указателя или неправильное значение используются в обработчике. Так или иначе я не хочу, чтобы тот код обработчика был выполнен, если пользователь не выбирает переключатель после того, как форма была загружена.

Я в настоящее время обхожу это, не инициализируя переключатель, но я должен установить то значение по умолчанию в конечном счете, и лучшее место от разработчика. Я также могу добавить булево поле, это не установлено на истинный, пока форма полностью не загружается, и не обрабатывают события, если это - ложь, но это - грязный взлом.

Что я могу сделать, чтобы препятствовать тому, чтобы тот обработчик выполнил свой код?

20
задан Marcel Gosselin 22 December 2014 в 14:39
поделиться

3 ответа

"Я также могу поместить булево поле, которое не устанавливается в true до полной загрузки формы, и не обрабатывать события, если это false, но это грязный хак."

Это также самый простой и лучший способ сделать это!

Допустим, .NET предоставляет изящный способ отключения всех обработчиков событий, пока форма не загрузится. Даже только те, которые обрабатываете ВЫ. Это все равно не будет достаточно гибко, чтобы отключить то, что вы хотите включить, но отключить то, что вы не хотите. Часто происходит настройка формы, и вы хотите, чтобы события срабатывали. Также форма не будет построена правильно, если ни одно событие не сработает.

21
ответ дан 29 November 2019 в 23:19
поделиться

Чтобы он выглядел немного менее грязным, если вы инициализируете элементы управления в конструкторе формы, вы можете использовать формы 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
28
ответ дан 29 November 2019 в 23:19
поделиться

Простое решение - объявить инициализирующую переменную:

  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
3
ответ дан 29 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: