【问题标题】:How to append text to the richTextBox from another class in VB.NET Winform?如何将文本从 VB.NET Winform 中的另一个类附加到richTextBox?
【发布时间】:2016-03-19 18:03:00
【问题描述】:

我有一个名为 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

【问题讨论】:

  • 你在哪里打电话给子FZConsole
  • 我用线程调用它。 Dim thread_fzconsole As System.Threading.Thread = New System.Threading.Thread(AddressOf FZConsole.FZConsole)
  • 您应该在启动之前将 Form 或 RichTextBox 实例传递给您的线程。 您还需要调用 RTB 的更新,否则您将面临CrossThreadOperation 异常。
  • 你能给我看一个上面有一些 cmets 的例子,这样我可以更容易地学习吗?那很好啊!我在使用线程方面没有那么经验。
  • 我的这两个答案显示了调用示例:Answer 1, Answer 2

标签: c# .net vb.net winforms


【解决方案1】:

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

你可以这样想:两个人不能同时写一篇论文。

调用通常并不难。基本上就是在做这两件事:

  1. 检查控件或其容器是否需要调用。
  2. 必要时调用。

使用委托方法执行调用。如果您的目标是 .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

【讨论】:

  • @Randomizers :如果我解决了您的问题,请记得标记为答案。 :)
  • 它说 InvokeRequired 没有为 FZConsole 声明,我试图在 main 中创建一个类,但这不起作用它没有附加文本所以:/
  • @Randomizers:对,对不起。我在表单上下文中使用了Me。因此,将每个Me 替换为例如Form1(请注意,您必须针对要更新的表单)。我编辑了我的答案来纠正这个问题。
  • InvokeRequired 是表单和控件的属性。它用于知道您是否需要调用(足够简单)。试试我的编辑,它应该可以工作。
  • 它仍然没有将文本附加到文本框。这是我启动线程的方式。 Dim thread_fzconsole As System.Threading.Thread = New System.Threading.Thread(AddressOf FZConsole.FZ2Console)
【解决方案2】:
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

【讨论】:

  • 如果我想发送其他字符串而不是字符串怎么办?喜欢(“总玩家数:” + pPlayers)
  • 所以写另一个返回整数的函数。您需要阅读有关编程语言基础知识(函数和返回类型 OOP 等)的非常基本的内容。如果这就是答案,请将其标记为答案。
  • 请在您的答案中包含某种解释,而不仅仅是代码。这是做什么的,他为什么要使用它?
  • 检查,我按照你说的做了一个答案,但由于某种原因它仍然无法工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
相关资源
最近更新 更多