vb.net TextBox不会改变

时间:2018-04-21 07:21:38

标签: vb.net module textbox event-handling

我无法更新其他模块中的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

1 个答案:

答案 0 :(得分:0)

默认情况下,FileSystemWatcher会在辅助线程上引发事件。表单的默认实例是特定于线程的,因此如果您在UI线程上显示表单的默认实例,然后尝试从FileSystemWatcher事件的处理程序(或从该处理程序调用的方法)访问默认实例那么你实际上指的是两个不同的表单对象。

最简单的选择是在UI线程上设置SynchronizingObject的{​​{1}}属性。您可以为该属性分配表单或其他控件,然后FileSystemWatcher将在拥有该控件的线程(即UI线程)上引发其事件。如果确实沿着那条路走下去,请确保您的事件处理程序快速执行。您不希望将UI线程与长时间运行的代码捆绑在一起,这就是默认情况下使用辅助线程的原因。

另一个选择是使用模块中的FileSystemWatcher类来允许您封送对UI线程的方法调用。您将继续让SynchronizationContext在辅助线程上提升其事件并在那里执行后台工作,然后在FileSystemWatcher上调用SendPost以调用方法UI线程,其中使用该表单的默认实例将引用您已经显示的相同实例。

但基本上,那里的架构很糟糕。您几乎肯定会使用类而不是模块,然后表单可以保持对该类实例的引用。然后,类可以引发表单可以处理的适当事件,然后表单可以更新自己的SynchronizationContext。如果您访问该表单之外的表单上的控件,则代码本质上是错误的。默认表单实例使这样做更容易,这是经验丰富的开发人员通常不喜欢它们的一个原因。它们使初学者更容易上手和跑步,但是当事情变得复杂时,初学者也可以更容易地将自己画成角落。