[英]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.