2011-09-27 134 views
0

當我嘗試在程序中的不同窗體之間切換時,我總是會遇到異常。也許你會幫我解決這個問題。下面是異常消息:窗體之間的切換(VB.NET)

Control.Invoke必須用於與

我重視了形式非常漂亮的變量在一個單獨的線程創建的控件進行交互,當我嘗試使用命令出現此問題像MyForm.Show()。

當窗體沒有附加到變量時,並不會發生這種情況,但是當刷新文本框和東西時,我遇到了碰撞問題。

希望能儘快聽到您的聲音!


edit;

我有4種不同的形式。當我加載主模塊和主要形式,在小組(...)把手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 

這是我爲了獲得對刷新表單的完全控制而提出的問題。這是摩托羅拉掃描儀與Windows CE的程序。現在,例如,當我在LoginForm中輸入正確的密碼時,我想切換到RegularForm。當我嘗試使用RegularForm.Show()或RegularForm.ShowDialog或RegularForm.BringToFront()時,我收到一個異常。當我嘗試用frmRegularUse.Show()調用窗體時,我可以調用窗體,但是它正在另一個線程中創建,我相信,所以我放鬆了對它的控制(當我嘗試從鍵盤上放置某些東西時,沒有迴應)。

+0

是MyForm窗體的類名還是它的類的實例? – Martin

+1

請張貼一些代碼來展示你如何創建和展示不同的表單,這將有助於我們理解問題的癥結所在。 –

回答

1

我懷疑窗體是在不同的線程中創建的,但是如果它們是STOP,那麼返回並修復它。應該從主GUI線程創建和訪問所有表單。其次,我不認爲你「新」了表格。你需要的東西是這樣的:

StartupForm = New frmStartup 
RegularForm = New frmRegularUse 
LoginForm = New frmLogin 
PasswordForm = New frmPassword 
SettingsForm = New frmSettings 
+0

「的目標版本。NET Compact Framework不支持後綴綁定「;-) – jarek

+0

是的,VB.NET的'form type = form object'功能在嘗試線程時遇到了很多vb程序員的麻煩,首先調用STOP,frmStartup.BeginInvoke()不工作 –

+0

@jarek我不知道你在說什麼,但我一直在爲Moto和Intermec嵌入式設備編碼,如果你想要一個單獨的命名實例,那麼你需要包含在你的Sub Main中的代碼。在對Application.Run()的調用中傳遞你的主窗體的單例...不要再重新創建它。 – tcarvin

0

其實,我所做的是:
不過我有相同的代碼在主模塊中,它是:

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

而且所以...
我做了一些測試,它的工作原理很好。明天我會盡量讓它更復雜一點。 ;-)