繁体   English   中英

从VB.NET中的另一个类/线程访问TextBox控件时出现问题

[英]Problem accessing a TextBox control from another class/thread in VB.NET

我试图从另一个类和线程访问一个richtextbox,然后用户界面和我似乎无法使其工作。 我目前有一个sub thats处理一个公共类和一个sharedsub内部的工作,我将要从几个不同的类和线程中调用它,但是我似乎无法正常工作。 代码看起来像这样。

Public Class SharedSubs

Public Shared Sub console(ByVal message As String)
    Dim c As New Form1
    If c.consoleBox.Text.Length > 0 Then
        If c.consoleBox.Text.Substring(c.consoleBox.Text.Length - 3, 3) = "..." Then
            c.consoleBox.AppendText(message)
        ElseIf c.consoleBox.Text.Substring(c.consoleBox.Text.Length - 1, 1) = "." Then
            c.consoleBox.AppendText(ControlChars.NewLine & timeStamp() & message)
        End If
    Else
        c.consoleBox.AppendText(timeStamp() & message)
    End If
End Sub

当从ui线程调用它时,我将使用SharedSubs.Console("stringstring")调用sub,它可以正常工作,但是当它从任何其他线程或类中调用时,它什么也没做,我已确认它将通过此​​代码,但未显示任何内容在文本框中,它不是由于委托而导致的异常,我认为这样会。

我这样做是完全错误的吗? 谢谢一些帮助。

您不能从主/ UI线程之外的其他线程修改Winforms UI组件的显示。 要从另一个线程更新,请查看Control.Invoke的文档。 它有一个很好的例子。

http://msdn.microsoft.com/en-us/library/zyzhdc6b%28v=VS.100%29.aspx

理想情况下,使用事件,然后您可以将其他内容附加到Textupdate ...例如,您可能要显示它并对其进行记录...然后您只需将表单和日志绑定到该事件。

如果您确实想在表单上调用该方法,则需要在适当的线程上调用它。 这可以通过2种方式完成。

在创建线程的类中,将对窗体/控件的引用传递到构造函数中(因此,该引用此时位于同一线程上)。 将引用存储在您的班级中。 然后创建您的线程。 (不要使用共享,以便您引用正确的实例)

Delegate sub ConsoleDelegate(byval message as string)
Public Sub console(ByVal message As String)

然后,在您的线程中,只需调用表单即可。

mForm.Invoke(new ConsoleDelegate(addressof DoSomething), new object(){message})

要么

您可以从线程中调用窗体上的方法,并在窗体上的Method内部。

private Delegate sub ConsoleDelegate(byval message as string)
Public Sub console(ByVal message As String)
  If me.InvokeRequired then
      me.Invoke(new ConsoleDelegate(addressof DoSomething), new object(){message})
      return
  end if 
  'Do the actual work.
end sub 

尝试在表单加载时添加以下代码:

Me.CheckForIllegalCrossThreadCalls = False

它应该解决问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM