none
請問close, dispose與form的關係 RRS feed

  • 問題

  • 1. 請問pda form右上角的 [ok]按下去,是會觸發close,dispose 哪個事件?

     

    2.form使用close 或是dispose之後,是不是無法再以frorm.show的方法叫出來?

     

    3.承2,被close 或dispose 的form 要如何再叫出來?

     

     

    2008年5月6日 上午 07:54

解答

  • 補充一下,你可以用下面程式碼來觀察事件發生的順序(我使用的是VB)

    Code Snippet

    Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
            Debug.WriteLine(Now.Ticks & ": Form Closed..")
        End Sub

     

        Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
            Debug.WriteLine(Now.Ticks & ": Form Closing..")
        End Sub

     

        Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Disposed
            Debug.WriteLine(Now.Ticks & ": Form Disposed..")
        End Sub

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.MinimizeBox = False
        End Sub

     

     

    另外預設Form的右上角會是"X"(也就是允許最小化),在"X"的時候點下去,這時候是不會把Form關閉的,而是讓Form躲起來;而設定Me.MinimizeBox = False(不允許最小化),這時候右上角會變成"OK",這時候點選的時候會把Form關閉。

     

    要特別注意的一點,當用ShowDialog的方式去呼叫表單出來的時候,要自行在關閉Form的相關事件中呼叫Diapose,節錄部分說明如下

    Code Snippet

     

    當表單顯示為強制回應對話方塊時,按一下 [關閉] 按鈕 (表單右上角帶有 X 的按鈕) 會將表單隱藏起來,並將 DialogResult 屬性設定為 DialogResult.Cancel。不像非強制回應表單,當使用者按一下對話方塊的關閉表單按鈕或設定 DialogResult 屬性值時,.NET Framework 不會呼叫 Close 方法。反而表單會隱藏並可再次顯示,不需建立對話方塊的新執行個體。因為顯示為對話方塊的表單未關閉,當應用程式不再需要表單時,您必須呼叫表單的 Dispose 方法。

     

     

    所以說,如果說Form2上面有一個TextBox,我用ShowDialog的方式把Form叫出來並且在TextBox上面打些字,關閉的時候如果沒有自行處理Dispose的部分,那麼第二次把Form呼叫出來的時候,會看到上次在TextBox中輸入的字。

    2008年5月6日 上午 10:24
    版主

所有回覆

  •  

    1. 請問pda form右上角的 [ok]按下去,是會觸發close,dispose 哪個事件?

        右上角的 [ok]正確的名字叫做Smart Minimize, 按下之後不會關閉Form, 也不會Dispose Form

    2.form使用close 或是dispose之後,是不是無法再以frorm.show的方法叫出來?

       Show方法可以將被隱藏(Hide)的Form顯示出來

    3.承2,被close 或dispose 的form 要如何再叫出來?

       已Dispose的Form必須重新建立Form物件, 再呼叫ShowDialog來顯示, 未Dispose的Form可以直接呼叫ShowDialog來顯示

     

    tihs

    2008年5月6日 上午 08:47
  • 補充一下,你可以用下面程式碼來觀察事件發生的順序(我使用的是VB)

    Code Snippet

    Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
            Debug.WriteLine(Now.Ticks & ": Form Closed..")
        End Sub

     

        Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
            Debug.WriteLine(Now.Ticks & ": Form Closing..")
        End Sub

     

        Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Disposed
            Debug.WriteLine(Now.Ticks & ": Form Disposed..")
        End Sub

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.MinimizeBox = False
        End Sub

     

     

    另外預設Form的右上角會是"X"(也就是允許最小化),在"X"的時候點下去,這時候是不會把Form關閉的,而是讓Form躲起來;而設定Me.MinimizeBox = False(不允許最小化),這時候右上角會變成"OK",這時候點選的時候會把Form關閉。

     

    要特別注意的一點,當用ShowDialog的方式去呼叫表單出來的時候,要自行在關閉Form的相關事件中呼叫Diapose,節錄部分說明如下

    Code Snippet

     

    當表單顯示為強制回應對話方塊時,按一下 [關閉] 按鈕 (表單右上角帶有 X 的按鈕) 會將表單隱藏起來,並將 DialogResult 屬性設定為 DialogResult.Cancel。不像非強制回應表單,當使用者按一下對話方塊的關閉表單按鈕或設定 DialogResult 屬性值時,.NET Framework 不會呼叫 Close 方法。反而表單會隱藏並可再次顯示,不需建立對話方塊的新執行個體。因為顯示為對話方塊的表單未關閉,當應用程式不再需要表單時,您必須呼叫表單的 Dispose 方法。

     

     

    所以說,如果說Form2上面有一個TextBox,我用ShowDialog的方式把Form叫出來並且在TextBox上面打些字,關閉的時候如果沒有自行處理Dispose的部分,那麼第二次把Form呼叫出來的時候,會看到上次在TextBox中輸入的字。

    2008年5月6日 上午 10:24
    版主