如何识别触发事件的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.
相关产品推荐
相关产品推荐

