Переключение между формами (VB.NET)

Я всегда получаю исключение, когда пытаюсь переключаться между разными формами в своей программе. Может быть, вы поможете мне решить эту проблему. Вот сообщение об исключении:

Control.Invoke должен использоваться для взаимодействия с элементами управления, созданными в отдельном потоке

Я прикрепил формы к очень хорошим переменным, и эта проблема возникает, когда я пытаюсь использовать такую ​​команду, как MyForm.Show().

Это не происходит, когда формы не привязаны к переменным, но тогда у меня возникают колосальные проблемы с обновлением текстовых полей и прочее.

Надеюсь услышать вас в ближайшее время!


редактировать;

У меня 4 разные формы. Когда я загружаю основной модуль и основную форму, в Sub(...) Handles MyBase.Load я выполняю следующий код:

В модуле:

Public StartupForm As frmStartup
Public RegularForm As frmRegularUse
Public LoginForm As frmLogin
Public PasswordForm As frmPassword
Public SettingsForm As frmSettings

В основной форме:

RegularForm = Me
StartupForm = frmStartup
LoginForm = frmLogin
PasswordForm = frmPassword
SettingsForm = frmSettings

Это подход, который я разработал, чтобы получить полный контроль над обновлением форм. Это программа для сканера Motorola с Windows CE. Теперь, например, когда я ввожу правильный пароль в LoginForm, я хочу переключиться на RegularForm. Когда я пытаюсь использовать RegularForm.Show(), RegularForm.ShowDialog или RegularForm.BringToFront(), я получаю исключение. Когда я пытаюсь вызвать форму с помощью функции frmRegularUse.Show(), я могу вызвать форму, но я полагаю, что она создается в другом потоке, поэтому я теряю контроль над ней (когда я пытаюсь ввести что-то с клавиатуры, ответа нет).


person jarek    schedule 27.09.2011    source источник
comment
Является ли MyForm именем класса формы или экземпляром класса?   -  person Martin    schedule 27.09.2011
comment
Пожалуйста, опубликуйте код, показывающий, как вы создаете и показываете различные формы, это поможет нам понять, в чем проблема.   -  person Meta-Knight    schedule 27.09.2011


Ответы (2)


Я сомневаюсь, что формы создаются в другом потоке, но если они затем СТОП, вернитесь и исправьте это. Все ваши формы должны быть созданы и доступны из основного потока графического интерфейса. Во-вторых, я не думаю, что вы «обновили» формы. Вам нужно что-то вроде этого:

StartupForm = New frmStartup 
RegularForm = New frmRegularUse 
LoginForm = New frmLogin 
PasswordForm = New frmPassword 
SettingsForm = New frmSettings 
person tcarvin    schedule 27.09.2011
comment
Целевая версия .NET Compact Framework не поддерживает позднее связывание ;-) - person jarek; 27.09.2011
comment
Да, функция VB.NET «тип формы = объект формы» доставила много vb-программистам серьезных проблем, когда они пытались создать многопоточность. Сначала вызовите STOP, frmStartup.BeginInvoke() не работает. - person Hans Passant; 27.09.2011
comment
@jarek Я не уверен, что вы пытаетесь сказать, но я все время пишу для встроенных устройств Moto и Intermec. Если вам нужен один именованный экземпляр ваших форм, вам нужно будет включить этот код в свой Sub Main. При вызове Application.Run() передайте синглтон, который является вашей основной формой... не обновляйте его снова. - person tcarvin; 27.09.2011

На самом деле я сделал следующее:
Тем не менее у меня есть тот же код в основном модуле, а именно:

Public StartupForm As frmStartup
Public RegularForm As frmRegularUse
Public LoginForm As frmLogin
Public PasswordForm As frmPassword
Public SettingsForm As frmSettings

Мне удалось это сделать самым простым способом. Например, я запускаю форму входа и выполняю следующий код (короче говоря):

LoginForm = Me
frmRegularUse.ShowDialog()

Я перехожу к форме frmRegularUse, где снова выполняю:

RegularForm = Me
frmPasswordForm.ShowDialog()

И так далее...
Я сделал несколько тестов, и все работает нормально. Завтра постараюсь сделать его немного более изощренным. ;-)

person jarek    schedule 27.09.2011