如何从VB.NET Winform中的另一个类将文本追加到richTextBox?

时间:2016-03-19 18:03:01

标签: c# .net vb.net winforms

我有一个名为Form1.vb的winform和一个名为FZConsole.vb的类 在winform上我有一个Richtextbox1,我试图从课程中添加文本,但它不起作用。

从Form1.vb我可以很容易地做到

Richtextbox1.AppendText("Console is currently ON.")

在课堂上我试图这样做,但它不起作用:

Class FZConsole
Public Sub FZConsole()
    While True
            Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class")

        Threading.Thread.Sleep(1)
    End While
End Sub
End Class

2 个答案:

答案 0 :(得分:0)

从其他线程访问控件时,通常必须调用控件的访问/更新。这样做是为了同步控件的更新,以便两个线程不会同时更新一个控件。

你可以这样想:两个人不能同时在同一张纸上写字。

调用通常没什么难的。它基本上只是做这两件事:

  1. 检查控件或其容器是否需要调用。
  2. 必要时调用。
  3. 使用Delegate方法执行调用。如果您以.NET Framework 4.0或更高版本为目标,则可以使用Sub() lambda表达式创建一个非常简单的委托。

    Public Sub FZConsole()
        While True
            If Form1.InvokeRequired = True Then 'Invocation is required.'
                Form1.Invoke(Sub() Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class"))
            Else 'Invocation is not required.'
                Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class")
            End If
    
            Threading.Thread.Sleep(1)
        End While
    End Sub
    

    但是,如果您的目标是.NET Framework 3.5或更低版本,事情会变得有点棘手。在定位早期框架时,您必须自己声明委托,并且它不像使用lambda那么简单,因为它在传递变量时的工作方式不同。

    Delegate Sub TextUpdaterDelegate(ByVal Text As String)
    
    Public Sub FZConsole()
        While True
            If Form1.InvokeRequired = True Then 'Invocation is required.'
                Form1.Invoke(New TextUpdaterDelegate(AddressOf RichTextBox1.AppendText), Environment.NewLine & "Test From Class")
            Else 'Invocation is not required.'
                Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class")
            End If
    
            Threading.Thread.Sleep(1)
        End While
    End Sub
    

答案 1 :(得分:-1)

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim newInstanceToClass As New SomeClass
        RichTextBox1.AppendText(newInstanceToClass.returenText)
    End Sub


    Class SomeClass
        Function returenText() As String
            Dim txt As String = "some text..."
            Return txt
        End Function
    End Class
End Class