2009-11-15 2 views
2

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

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

+0

Не забудьте поделиться своими кодами? Как вы называете этот нестатический/общий метод? –

+0

О, моя родительская форма была формой запуска приложения, и она создала экземпляр класса, который необходимо вызвать в форме запуска. Наконец-то он работает, см. Мой ответ ниже. –

ответ

1

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

CType(My.Application.OpenForms.Item("Form1"), Form1).myMethod() 
+0

Ха, хорошо, примите свой ответ! –

3

Это классический вопрос, когда вы используете резьбу. Переменная экземпляра формы имеет атрибут <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 

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

Смежные вопросы