You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别触发事件的FileSystemWatcher对应的TabPage或子窗体?

解决方案:关联FileSystemWatcher与TabPage/子窗体

要实现事件触发时识别对应的TabPage或子窗体,有两种直接可行的方法:


方法一:利用Tag属性建立关联

控件的Tag属性可以存储任意对象,我们可以把FileSystemWatcher所属的子窗体或TabPage存入其中,在事件处理时取出使用。

步骤1:修改主窗体中FileSystemWatcher的初始化代码

在创建Fsw时,将关联的子窗体存入Tag,同时修正事件绑定的对象(原代码中绑定了w.Watcher的事件,但实际初始化的是子窗体的Fsw,两者需统一):

Private Sub CreateTabPageWatcher(w As ClsCfgWatcher)
    ' 添加TabPage代码不变...

    ' 创建子窗体代码不变...

    With f
        ' 控件赋值代码不变...

        ' 创建FilesystemWatcher并设置Tag
        .Fsw = New FileSystemWatcher With {
                .Path = w.Path,
                .Filter = w.Filter,
                .IncludeSubdirectories = w.IncludeSubdirs,
                .NotifyFilter = DirectCast(w.NotifyFilter, NotifyFilters),
                .Tag = f ' 将当前子窗体存入Tag
                }

        ' 绑定子窗体Fsw的事件,而非w.Watcher
        AddHandler f.Fsw.Created, AddressOf Fsw_Event
        AddHandler f.Fsw.Changed, AddressOf Fsw_Event
        AddHandler f.Fsw.Renamed, AddressOf Fsw_Event
        AddHandler f.Fsw.Deleted, AddressOf Fsw_Event

        f.Fsw.EnableRaisingEvents = True
    End With
End Sub

步骤2:修改事件处理程序

在主窗体的Fsw_Event中,从sender取出FileSystemWatcher,再通过Tag获取子窗体和对应的TabPage:

Private Sub Fsw_Event(sender As Object, e As FileSystemEventArgs)
    If e.FullPath <> "" Then
        ' 转换sender为FileSystemWatcher对象
        Dim fsw = DirectCast(sender, FileSystemWatcher)
        ' 从Tag取出关联的子窗体
        Dim childForm = DirectCast(fsw.Tag, FrmCfgWatcher)
        ' 通过子窗体的Parent属性获取所在TabPage
        Dim tabPage = DirectCast(childForm.Parent, TabPage)

        ' 现在可以访问子窗体控件和TabPage信息
        Dim sCmd As String = childForm.TxtCommand.Text
        ' 示例:输出TabPage名称
        ' MessageBox.Show($"事件来自TabPage:{tabPage.Text}")
    End If
End Sub

方法二:将事件逻辑封装到子窗体内部

把FileSystemWatcher的初始化和事件处理都放在子窗体中,天然就能直接访问自身控件和所在TabPage,代码封装性更好。

步骤1:修改子窗体FrmCfgWatcher

添加初始化方法,内部完成Watcher配置和事件绑定:

Public Class FrmCfgWatcher
    Public Fsw As FileSystemWatcher

    ' 添加初始化方法,接收配置参数
    Public Sub InitializeWatcher(w As ClsCfgWatcher)
        ' 设置控件值
        TxtName.Text = w.Name
        TxtPath.Text = w.Path
        CbxSubDirs.Checked = w.IncludeSubdirs
        TxtFilter.Text = w.Filter

        TxtCommand.Text = w.ActionCommand
        TxtParameter.Text = w.ActionParameter
        TxtWorkingDir.Text = w.ActionWorkingDir

        ' 初始化FileSystemWatcher
        Fsw = New FileSystemWatcher With {
            .Path = w.Path,
            .Filter = w.Filter,
            .IncludeSubdirectories = w.IncludeSubdirs,
            .NotifyFilter = DirectCast(w.NotifyFilter, NotifyFilters)
        }

        ' 绑定自身的事件处理程序
        AddHandler Fsw.Created, AddressOf Fsw_Event
        AddHandler Fsw.Changed, AddressOf Fsw_Event
        AddHandler Fsw.Renamed, AddressOf Fsw_Event
        AddHandler Fsw.Deleted, AddressOf Fsw_Event

        Fsw.EnableRaisingEvents = True
    End Sub

    Private Sub Fsw_Event(sender As Object, e As FileSystemEventArgs)
        If e.FullPath <> "" Then
            ' 直接访问自身控件
            Dim sCmd As String = Me.TxtCommand.Text
            ' 获取所在TabPage
            Dim tabPage = DirectCast(Me.Parent, TabPage)
            ' 后续逻辑处理
        End If
    End Sub
End Class

步骤2:简化主窗体代码

主窗体只需创建TabPage和子窗体,调用初始化方法即可:

Private Sub CreateTabPageWatcher(w As ClsCfgWatcher)
    ' 添加TabPage代码不变...

    Dim f As New FrmCfgWatcher With {
        .TopLevel = False,
        .Anchor = AnchorStyles.Right Or AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Bottom,
        .Width = tp.Width, ' 改为使用当前TabPage的尺寸更准确
        .Height = tp.Height
    }
    tp.Controls.Add(f)
    f.Show()

    ' 调用子窗体初始化方法
    f.InitializeWatcher(w)
End Sub

内容的提问来源于stack exchange,提问作者Tobias G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:35:24