当属性 EnableRaisingEvents 更改时,将事件添加到 FileSystemWatcher

Add event to FileSystemWatcher when property EnableRaisingEvents changed

提问人:Tobias G. 提问时间:10/27/2022 更新时间:1/15/2023 访问量:66

问:

我创建了一个自定义类

Public Class MyFSW
    Inherits FileSystemWatcher
    Public Property ParentForm As Form
    Public Property TabPage As TabPage
End Class

现在我想向 this 类添加一个自定义事件,该事件在 FileSystemWatcher 的属性“EnableRaisingEvents”更改时触发?

有没有机会这样做?

vb.net 事件 filesystemwatcher

评论


答:

0赞 jmcilhinney 10/27/2022 #1

该属性未声明,因此无法重写它。不过,您可以隐藏它:EnableRaisingEventsOverridable

Public Class FileSystemWatcherEx
    Inherits FileSystemWatcher

    Public Property ParentForm As Form
    Public Property TabPage As TabPage

    Public Shadows Property EnableRaisingEvents As Boolean
        Get
            Return MyBase.EnableRaisingEvents
        End Get
        Set(value As Boolean)
            If MyBase.EnableRaisingEvents <> value Then
                MyBase.EnableRaisingEvents = value
                OnEnableRaisingEventsChanged(EventArgs.Empty)
            End If
        End Set
    End Property

    Public Event EnableRaisingEventsChanged As EventHandler

    Protected Overridable Sub OnEnableRaisingEventsChanged(e As EventArgs)
        RaiseEvent EnableRaisingEventsChanged(Me, e)
    End Sub

End Class

只要您通过 类型 的引用设置属性,这将起作用。由于该属性是隐藏的,而不是重写的,因此通过类型的引用设置它将绕过派生的属性实现,并且不会引发事件。你真的对此无能为力。FileSystemWatcherExFileSystemWatcher

0赞 G3nt_M3caj 10/27/2022 #2

作为“上一个示例”的延续,您可以通过一些小的更改来实现这一点,如下例所示:

在此示例中,通过单击按钮来更改属性,但您可以根据需要实现处理程序。

Option Strict On
Imports System.IO


Public Class Form1
    Private Fsw As CustomFSW


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CreateFSW()
    End Sub

    Sub CreateFSW()

        Fsw = New CustomFSW With {
                .Name = "Tab1", 'Adding this you can specify the object is sending the event
                .Path = "C:\Users\UserName\Desktop\Test\",
                .Filter = "*.*",
                .IncludeSubdirectories = True,
                .EnableRaisingEvents = True
                }


        AddHandler Fsw.Created, AddressOf Fsw_Event
        AddHandler Fsw.Changed, AddressOf Fsw_Event
        AddHandler Fsw.Renamed, AddressOf Fsw_Event
        AddHandler Fsw.Deleted, AddressOf Fsw_Event

        'Here the handler of your custom event
        AddHandler Fsw.MyCutomEvent, AddressOf Fsw_CutomEvent

    End Sub

    Private Class CustomFSW
        Inherits FileSystemWatcher

        Private counter As Integer = 0
        Public Property Name As String

          'You can use the base property instead of this for specific needs
        Private _EnableRaisingEvents As Boolean
        Public Overloads Property EnableRaisingEvents As Boolean
            Get
                Return _EnableRaisingEvents
            End Get
            Set(value As Boolean)
                If Not value = _EnableRaisingEvents Then
                    counter += 1
                    RaiseEvent MyCutomEvent(Me, "Ciaooo, EnableRaisingEvents is changed " & counter.ToString & " times")
                End If
                _EnableRaisingEvents = value
            End Set
        End Property

        'Rename this on your needs 
        Public Event MyCustomEvent(sender As Object, e As String)


    End Class


    Private Sub Fsw_CustomEvent(sender As Object, e As String)
        ' Do your stuff here 
        MsgBox(e)
    End Sub


    Private Sub Fsw_Event(sender As Object, e As FileSystemEventArgs)
        Dim FSW As CustomFSW = CType(sender, CustomFSW)
        If Not String.IsNullOrEmpty(FSW.Name) Then
            Select Case FSW.Name
                Case "Tab1"
                    'Do something
                    Debug.WriteLine("Event generated from: " & FSW.Name)

                Case "Tab2"
                    'Do something else 
                    Debug.WriteLine("Event generated from: " & FSW.Name)

            End Select
        End If

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Fsw IsNot Nothing Then
            Fsw.EnableRaisingEvents = Not Fsw.EnableRaisingEvents
        End If
    End Sub

End Class
0赞 Tobias G. 10/27/2022 #3

到目前为止谢谢你! 这是我现在得到的(在我的类文件中):

Public Class MyFSW
    Inherits FileSystemWatcher
    Public Property ParentForm As Form
    Public Property TabPage As TabPage

    Public Shadows Property EnableRaisingEvents As Boolean
        Get
            Return MyBase.EnableRaisingEvents
        End Get
        Set(value As Boolean)
            If MyBase.EnableRaisingEvents <> value Then
                MyBase.EnableRaisingEvents = value
                OnEnableRaisingEventsChanged(EventArgs.Empty)
            End If
        End Set
    End Property

    Public Event EnableRaisingEventsChanged As EventHandler

    Protected Overridable Sub OnEnableRaisingEventsChanged(e As EventArgs)
        RaiseEvent EnableRaisingEventsChanged(Me, e)
    End Sub
End Class

在我的 Form-Class 中得到了这个:

Sub CreateFSW()
    w.Watcher = New MyFSW With {
            .ParentForm = f,
            .TabPage = tp,
            .Path = w.Path,
            .Filter = w.Filter,
            .IncludeSubdirectories = w.IncludeSubdirs,
            .NotifyFilter = DirectCast(w.NotifyFilter, NotifyFilters)
            }

    AddHandler w.Watcher.Created, AddressOf Fsw_EventRaise
    AddHandler w.Watcher.Changed, AddressOf Fsw_EventRaise
    AddHandler w.Watcher.Renamed, AddressOf Fsw_EventRaise
    AddHandler w.Watcher.Deleted, AddressOf Fsw_EventRaise

    AddHandler w.Watcher.EnableRaisingEventsChanged, AddressOf Fsw_Event
End Sub

Private Sub Fsw_Event(sender As Object, e As FileSystemEventArgs)
    MessageBox.Show("Works")
End Sub

编译器说:

Option Strict On does not allow narrowing in implicit type conversions between method Fsw_Event(sender As Object, e As FileSystemEventArgs) and delegate Delegate Sub EventHandler(sender As Object, e As EventArgs)

似乎有些类型不匹配。我试图将FileSystemEventArgs更改为EventArgs之类的东西,但没有运气。

评论

0赞 Tobias G. 10/27/2022
我想我明白了。更改了此行:Public Shared Sub Fsw_EventOnOff(sender As Object, e As EventArgs)