Как вызвать метод в экземпляре формы VB.NET по умолчанию вместо создания другого экземпляра? - PullRequest
2 голосов
/ 15 ноября 2009

Когда экземпляр класса вызывает метод в родительском классе формы, VB.NET запускает новый экземпляр класса формы вместо вызова метода для активного!

Как мне сказать, что у меня есть только один экземпляр моего класса формы или что я не хочу создавать новый экземпляр формы и просто вызывать метод в уже активной форме?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2009

Это классическая проблема при использовании потоков. Переменная экземпляра формы имеет атрибут <ThreadStatic>. Что заставляет его создавать новый экземпляр формы, когда ваш код выполняется в другом потоке. Это может быть трудно обнаружить, форма не видна, так как вы не вызывали ее метод 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 (). Хотя для этого требуется доступ к форме или контрольному экземпляру, это немного проблематично. Лучше всего просто передать экземпляр формы в конструктор класса помощника:

Class Helper
  Private mForm As Form1
  Public Sub New(ByVal frm As Form1)
    mForm = frm
  End Sub
End Class

Теперь у вас есть нужный вам экземпляр.

1 голос
/ 15 ноября 2009

Хорошо, нашел ответ. Вы должны получить доступ к своей форме через коллекцию OpenForms.

CType(My.Application.OpenForms.Item("Form1"), Form1).myMethod()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...