2010-11-04 134 views
0

我將此應用程序從VB6轉換而來。我有兩種形式。 Form1通過菜單項實例化Form2。 點擊關閉(X)時,我無法讓Form2結束。如果Form2處於「空閒」狀態,則罰款關閉;但如果我在循環中處理所有事件觸發的事件,但它會繼續在Form2中處理。我試着搞清楚Dispose,Close,Application.Exit,Application.ExitThread。我最後一次嘗試創建自己的事件來回擊Form1並處理Form2 - 它擊中它,但Form2仍在運行。這筆交易是什麼?順便說一句,如果我只使用Show vs ShowDialog - Form2只是閃爍並消失。VB.NET ShowDialog窗體無法結束

Form1 does this 
Dim f2 as Import 
: 
     Hide() 
     f2 = New Import 
     AddHandler f2.die, AddressOf killf2 
     f2.ShowDialog(Me) 
     Show() 

Private Sub killf2() 
     f2.Dispose() 
     f2 = Nothing 
End Sub 

Form2 

Public Event die() 
Private Shadows Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing 
     Dispose() 
     Close() 
     e.Cancel = False 
     RaiseEvent die() 
End Sub 

回答

0

我想你已經把事件交叉了。你想讓form1包含form2的一個實例來監聽form2的form_closing事件。那麼你可以設置f2 =無。

Form1應完全包含form2。

這裏有一個例子:

Public Class MDIMain 
    Private WithEvents _child As frmViewChild 

    Friend Sub viewChildShow() 
     _child = New frmViewChild 
     _child.MdiParent = Me 
     _child.WindowState = FormWindowState.Maximized 
     _child.Show() 
    End Sub 

    Private Sub _child_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles _child.FormClosing 
     _child = Nothing 
    End Sub 

不添加任何東西到窗口2,儘量

Dim f2 as Import 
     Hide() 
     f2 = New Import 
     f2.ShowDialog(Me) 
     Show() 

Private Sub f2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles f2.FormClosing 
     set f2 = nothing 
End Sub 

回覆:您的評論 它可以追溯到窗口2並繼續處理的下一條語句點擊事件處理程序

這是一個功能,它會導致此行爲。你需要確保me.close或者關閉我是form2中的最後一個語句,那就沒有別的東西可以執行了。

+0

我剛剛調用事件Form1_FormClosing,因爲我複製並粘貼。它實際上處理MyBase.FormClosing - 對於form2。如果這不是你的意思 - 那麼我怎樣才能在form1中監聽form 2的form_closing事件,而不僅僅是提高一個事件並設置f2 =沒有像我所做的那樣。謝謝! – 2010-11-04 20:51:21

+0

我想可能是你所提到 – 2010-11-04 21:23:51

+0

昏暗WITHEVENTS F2作爲進口 – 2010-11-04 21:24:13

0

你說的這個循環是什麼?用戶界面(Windows)與正在運行的任何代碼分開。在您的類派生表單窗體中,允許代碼在創建窗體之前以及窗體銷燬之後運行。如果代碼嘗試訪問用戶界面對象,則可能會發生異常,但在沒有用戶界面的情況下,不會阻止代碼運行。

如果你想讓你的「for」循環退出,那麼你必須以某種方式發送一個信號,例如,通過創建一個布爾型的「退出」成員變量。當表單關閉時設置「quit = True」,然後讓你的「for」循環檢查它是否爲真。

相關問題