我的主表單中有一個 TabControl,每個 TabPage 都是動態添加的表單。這些(子)表單包含嚴格的控制元件(文本框、復選框等)以及 FileSystemWatcher。
在 TabPage 中添加表單時,FileSystemWatcher 使用路徑、過濾器等進行初始化,并且 EnableRaisingEvents 設定為 true。
這里是這部分的代碼(來自我的主要形式):
Private Sub ApplyConfig
For Each w As ClsCfgWatcher In MyWatchers
'// create TabPage
Call CreateTabPageWatcher(w)
Next
End Sub
Private Sub CreateTabPageWatcher(w As ClsCfgWatcher)
'// add tabpage
TabWatcher.TabPages.Add(w.Name)
Dim tp As TabPage = TabWatcher.TabPages(w.Name)
With tp
.Text = w.Name
.UseVisualStyleBackColor = True
End With
'// adding form
Dim f As New FrmCfgWatcher With {
.TopLevel = False,
.Anchor = AnchorStyles.Right Or AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Bottom,
.Width = TabWatcher.SelectedTab.Width,
.Height = TabWatcher.SelectedTab.Height
}
tp.Controls.Add(f)
f.Show()
'// write values to form from config
With f
.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
'// create FilesystemWatcher
.Fsw = New FileSystemWatcher With {
.Path = w.Path,
.Filter = w.Filter,
.IncludeSubdirectories = w.IncludeSubdirs,
.NotifyFilter = DirectCast(w.NotifyFilter, NotifyFilters)
}
AddHandler w.Watcher.Created, AddressOf Fsw_Event
AddHandler w.Watcher.Changed, AddressOf Fsw_Event
AddHandler w.Watcher.Renamed, AddressOf Fsw_Event
AddHandler w.Watcher.Deleted, AddressOf Fsw_Event
w.Watcher.EnableRaisingEvents = True
End With
End Sub
事件確實按預期引發,但現在我需要知道究竟是哪個 FileSystemWatcher 引發的?例如來自哪個 TabPage,因為我需要來自處理事件的子中的那個 Tabpage 的一些資訊。
更多代碼(來自標簽頁中的表單):
Private Sub Fsw_Event(sender As Object, e As FileSystemEventArgs)
If e.FullPath > "" Then
Dim sCmd As String = [text from textbox on form]
End If
End Sub
我需要 FileSystemWatcher-Object 和我的 TabPage 或表單之間的一些鏈接,我不知道如何實作這一點。
任何人都可以幫忙嗎?
uj5u.com熱心網友回復:
有幾種技術可以做到這一點。取決于個人需要,其中一個人可以使用。在您的情況下,我認為一種方法可能是您可以創建一個繼承為基類的自定義類FileSystemWatcher。
此時,您可以Name使用包含FileSystemWatcher. 在您的事件處理程式中,您可以攔截Name然后根據引發事件的物件的名稱執行代碼。
這里有一個例子:
Option Strict On
Imports System.IO
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CreateFSW()
End Sub
Sub CreateFSW()
Dim 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
End Sub
Private Class CustomFSW
Inherits FileSystemWatcher
Public Property Name As String
End Class
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
End Class
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521937.html
