我有一个名为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
答案 0 :(得分:0)
从其他线程访问控件时,通常必须调用控件的访问/更新。这样做是为了同步控件的更新,以便两个线程不会同时更新一个控件。
你可以这样想:两个人不能同时在同一张纸上写字。
调用通常没什么难的。它基本上只是做这两件事:
使用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