如何在VB.NET窗体的默认实例中调用方法而不是实例化另一个?

时间:2009-11-15 04:36:02

标签: vb.net class forms

当实例化的类调用父窗体类中的方法时,VB.NET启动窗体类的新实例,而不是将方法调用到活动窗体上!

我如何告诉它我只有一个表单类的实例,或者我不想创建表单的新实例并只在已经激活的表单上调用该方法?

2 个答案:

答案 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()