我无法更新其他模块中的TextBox
内容
TextBox
位于名为frm_main
的表单中,而另一个模块中的EventHandler名为md_zeiss
。
frm_main
上的按钮调用了Init()。
问题:
如果我直接从frm_main
拨打测试(),会更改文字。
如果事件调用,它不更改文本,但显示正确的MessageBox。
代码:
Module md_zeiss
Sub Init()
Dim fsw As New FileSystemWatcher
fsw.Path = "C:\Output"
fsw.Filter = "*.txt"
fsw.NotifyFilter = NotifyFilters.Attributes Or NotifyFilters.CreationTime Or NotifyFilters.DirectoryName _
Or NotifyFilters.FileName Or NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.Security Or NotifyFilters.Size
fsw.EnableRaisingEvents = True
AddHandler fsw.Changed, AddressOf md_zeiss.Main
End Sub
Sub Main(sender As Object, e As IO.FileSystemEventArgs)
Do While IsLocked(e.FullPath) = True
Application.DoEvents()
Loop
Dim fs As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read)
Dim sr As New StreamReader(fs, System.Text.Encoding.Default)
Dim textline As String = vbNullString
Dim nr As String
Dim gi As String
Dim le As String
Do Until sr.Peek = -1
textline = sr.ReadLine
Select Case True
Case InStr(textline, vbTab & "Ø MOLDING_NR_SIDE" & vbTab)
nr = ReadVal(textline, 5)
Case InStr(textline, vbTab & "LENGTH" & vbTab)
gi = ReadVal(textline, 5)
Case InStr(textline, vbTab & "Ø MOLDING_GI_SIDE" & vbTab)
le = ReadVal(textline, 5)
End Select
Loop
Test()
End Sub
Sub Test()
frm_Main.TextBox1.Text = "Test"
MsgBox(frm_Main.TextBox1.Text)
End Sub
答案 0 :(得分:0)
默认情况下,FileSystemWatcher
会在辅助线程上引发事件。表单的默认实例是特定于线程的,因此如果您在UI线程上显示表单的默认实例,然后尝试从FileSystemWatcher
事件的处理程序(或从该处理程序调用的方法)访问默认实例那么你实际上指的是两个不同的表单对象。
最简单的选择是在UI线程上设置SynchronizingObject
的{{1}}属性。您可以为该属性分配表单或其他控件,然后FileSystemWatcher
将在拥有该控件的线程(即UI线程)上引发其事件。如果确实沿着那条路走下去,请确保您的事件处理程序快速执行。您不希望将UI线程与长时间运行的代码捆绑在一起,这就是默认情况下使用辅助线程的原因。
另一个选择是使用模块中的FileSystemWatcher
类来允许您封送对UI线程的方法调用。您将继续让SynchronizationContext
在辅助线程上提升其事件并在那里执行后台工作,然后在FileSystemWatcher
上调用Send
或Post
以调用方法UI线程,其中使用该表单的默认实例将引用您已经显示的相同实例。
但基本上,那里的架构很糟糕。您几乎肯定会使用类而不是模块,然后表单可以保持对该类实例的引用。然后,类可以引发表单可以处理的适当事件,然后表单可以更新自己的SynchronizationContext
。如果您访问该表单之外的表单上的控件,则代码本质上是错误的。默认表单实例使这样做更容易,这是经验丰富的开发人员通常不喜欢它们的一个原因。它们使初学者更容易上手和跑步,但是当事情变得复杂时,初学者也可以更容易地将自己画成角落。