Правильный способ создания событий в публичном классе в VB.NET
Я использую классы уже некоторое время, но я относительно новичок в создании событий в своих классах. Перед использованием событий, если бы я хотел сделать общедоступный класс, который был бы доступен во всем моем проекте, я бы создал глобальную переменную для класса, а затем инициализировал бы класс, прежде чем мне нужно было бы использовать этот класс:
Public ClassMFTV As New ClassMachineFunctionsTimerVars
Что я уже пробовал:
Теперь, когда я использую события, я обнаружил, что больше не могу использовать этот метод. Чтобы использовать события, мне нужно включить ключевые слова WithEvents в объявление класса:
Public WithEvents ClassMFTV As New ClassMachineFunctionsTimerVars
Когда я пытаюсь это сделать, я получаю следующую ошибку:
Предложение Handles требует переменной WithEvents, определенной в содержащем типе или одном из его базовых типов
Если я перемещаю объявление класса в свою стартовую форму, ошибка исчезает, но тогда я могу получить доступ только к переменным класса в этой форме. Мне нужно иметь возможность читать и обновлять переменные в моем классе на протяжении всего проекта. Как правильно это сделать плюс возможность запускать пользовательские события?
Вот часть моего урока. Я в основном использую этот класс для проверки изменений в серии переменных, которые собираются с помощью таймера. Когда переменная изменяется, я запускаю событие для обновления таких вещей, как графический интерфейс, база данных и т. д.
Public Class ClassMachineFunctionsTimerVars 'Raises events to update the machine function screens Private _Var826 As Integer = -9999 Private _Var827 As Integer = -9999 Public Event Var826ChangedEvent() Public Event Var827ChangedEvent() Public Property Var826() As Integer Get Var826 = _Var826 End Get Set(ByVal value As Integer) If value <> _Var826 Then _Var826 = value RaiseEvent Var826ChangedEvent() Else _Var826 = value End If End Set End Property Public Property Var827() As Integer Get Var827 = _Var827 End Get Set(ByVal value As Integer) If value <> _Var827 Then _Var827 = value RaiseEvent Var827ChangedEvent() Else _Var827 = value End If End Set End Property End Class
Вот мой код для обработки событий:
Public Sub Var826ChangedEventFired() Handles ClassMFTV.Var826ChangedEvent 'Update the radio button If Var826 = 0 Then Me.RadioXMasterHole.Checked = True FormOperatorCDC.RadioXMasterHole.Checked = True Else Me.RadioXSetPoint.Checked = True FormOperatorCDC.RadioXSetPoint.Checked = True End If End Sub Public Sub Var827ChangedEventFired() Handles ClassMFTV.Var827ChangedEvent 'Update the radio button If Var827 = 0 Then Me.RadioBNotTilted.Checked = True FormOperatorCDC.RadioBNotTilted.Checked = True Else Me.RadioBTilted.Checked = True FormOperatorCDC.RadioBTilted.Checked = True End If End Sub
CHill60
Используйте Улучшить вопрос ссылка для публикации кода из вашего класса - deos не обязательно должен быть всем этим, но убедитесь, что вы включили события и любые обработчики событий
Ralf Meier
Я не совсем понимаю ваше требование ...
Но... ваш класс каждый раз принадлежит тому родителю, где вы его создаете.
Если вы хотите, чтобы ваш класс был глобальным, вы должны создать его экземпляр там, где он не зависит от той или иной формы.
Вам нужно больше одного экземпляра из вашего класса ? Если вам это нужно только один раз, вы, возможно, могли бы создать его также как модуль ...
theskiguy
Мне нужно иметь только один экземпляр класса, однако мне нужно, чтобы этот экземпляр был доступен во всем проекте, а не только в Родительском. Я действительно не думаю, что хочу создавать экземпляр класса, потому что новый экземпляр будет просто копией исходного экземпляра. Не могли бы вы подробнее прокомментировать свой комментарий о создании его в модуле?
Richard Deeming
WithEvents
и Handles
это просто "синтаксический сахар". Вы можете достичь того же результата, вручную добавив обработчики событий с помощью AddHandler
.
Как написать обработчики событий[^]
Просто остерегайтесь утечек памяти, если ваш источник событий живет дольше, чем ваш подписчик событий.