2013-10-10 2 views
0

Если у меня есть событие, как это:О обработки пользовательского события

' <summary> 
' Event raised when conversion progress changes. 
' </summary> 
Public Shared Event PercentDone(ByVal percent As Integer) 

Sub(...) 
    CoreConverter.StartInfo.FileName = CoreConverter_Location 
    CoreConverter.Start() 

    While Not CoreConverter.HasExited 

     If ChrW(CoreConverter.StandardOutput.Read) = "*" Then 
      progress += 1 
      RaiseEvent PercentDone(progress) 
     End If 

    End While 

    CoreConverter.Close() 
    RaiseEvent Exited() 

End sub 

Как я могу написать обработчик событий в другом классе (например, по умолчанию, Form1 класса), как это:

Sub Converter_Progress(Progress As Integer) Handles CoreConverter.PercentDone 
    ' Some code... 
End Sub 

... Вместо того, чтобы добавлять вручную обработчик как это еще:

AddHandler CoreConverter.PercentDone, AddressOf Converter_Progress 

ответ

1

Для того, чтобы использовать Handles ключевое слово, необходимо объявить переменную как поле в классе (на уровне класса, а не локальными по отношению к любым способом) и сделать это, используя WithEvents ключевое слово. Например:

Public Class Test 
    Private WithEvents Converter As New CoreConverter() 

    Sub Converter_Progress(Progress As Integer) Handles Converter.PercentDone 
     ' Some code... 
    End Sub  
End Class 

Однако следует отметить, что, даже для пользовательских событий, рекомендуется следовать .NET конвенции для делегатов обработчиков событий, где всегда есть два аргумента: отправителя и арг событий , Самый простой способ сделать это состоит в использовании общего EventHandler(Of T) делегата, например:

Public Class PercentDoneEventArgs 
    Inherits EventArgs 

    Public Property Progress As Integer 
End Class 

Public Class CoreConverter 
    Public Event PercentDone As EventHandler(Of PercentDone) 

    ' ... 
End Class 

Затем ваш метод обработчика событий будет выглядеть следующим образом:

Sub Converter_Progress(sender As Object, e As PercentDoneEventArgs) Handles Converter.PercentDone 
    ' ... 
End Sub 
+0

Thankyou, но нет никакого способа сделать это, не создавая класс ?, у моего класса нет IDisposable, я знаю, как создать процедуру Dispose, но то, что я не знаю, - это в этом случае, потому что мне нужно поднять класс для обработки события, поскольку я хотеть. и другой вопрос, если я не прошу слишком много, я следил за твоими инструкциями о создании событий, но значение «Ничто» верно для переменной «e», просто мне больше не нужно проходить чем значение прогресса, поэтому ... Я здесь «ничего не сделал»: RaiseEvent PercentDone (прогресс, ничего) – ElektroStudios

+0

Вам не нужно немедленно создавать объект как часть декларации. Вы можете просто объявить переменную 'WithEvents', оставив ее вначале на« Nothing », после чего вы можете установить ее для ссылки на любой объект, который вы хотите позже. Вы можете изменить, какой объект он ссылается так часто, как вам нравится, но, очевидно, он может ссылаться только на один объект за раз. –

1

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

1

При объявлении экземпляра класса (в вашем случае «CoreConverter») вы должны использовать «WithEvents». Например:

Private WithEvents CoreConverter As MyConverterType 
Смежные вопросы