当实例化的类调用父窗体类中的方法时,VB.NET启动窗体类的新实例,而不是将方法调用到活动窗体上!
我如何告诉它我只有一个表单类的实例,或者我不想创建表单的新实例并只在已经激活的表单上调用该方法?
答案 0 :(得分:3)
使用线程时,这是一个经典问题。表单实例变量具有<ThreadStatic
&gt;属性。当代码在不同的线程中运行时,这会导致它创建表单的新实例。这可能很难检测,因为您没有调用其Show()方法,因此表单不可见。并不是说无论如何它都会起作用,线程不会引发消息循环。
您的解决方法有自己的问题。 Application.OpenForms实现中存在一个令人讨厌的错误,它在重新创建窗口时会丢失对表单的跟踪。请尝试以下代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.ShowInTaskbar = False
MessageBox.Show(String.Format("There are {0} form instances", Application.OpenForms.Count))
End Sub
您的问题有很多可能的解决方法。您可以使用Control.Begin / Invoke()封送对UI线程的调用。虽然这需要访问表单或控件实例,但有点像鸡蛋和鸡蛋问题。最好的办法是简单地将表单实例传递给helper的类构造函数:
Class Helper
Private mForm As Form1
Public Sub New(ByVal frm As Form1)
mForm = frm
End Sub
End Class
现在你拥有了你需要的实例。
答案 1 :(得分:1)
好的,找到了答案。您必须通过OpenForms
集合访问您的表单。
CType(My.Application.OpenForms.Item("Form1"), Form1).myMethod()