2017-05-17 44 views
3

我已經縮小我的問題這個簡單的例子,但似乎無法找到發生了什麼:VB形式重新出現,而無需請求

  • 我有兩種形式,通過單一按鈕,其他空。
  • 單擊按鈕時,Form1中隱藏和顯示窗口2
  • showung起來的時候,窗口2將隱藏,並顯示Form1中再次

此外,進入VisibleChanged時,窗體2將與一個MsgBox 停止代碼如下。

現在預期的行爲,在點擊按鈕時會

  • Form1中隱藏
  • 第一MSGBOX可見轉向真正由於Form1中調用Form2.show
  • 可見第二MSGBOX由於轉向假窗體2調用Me.hide
  • Form1中顯示出來

都這樣做happend,但隨後,

  • 窗體2顯示出來(Form1中仍然存在)
  • 一個MsgBox顯示出來(告知form2.visible再次真)
  • 一個MsgBox顯示出來(告訴現在form2.visible爲False)
  • Form2皮革

任何想法爲什麼?

下面的代碼:

Public Class Form1 
    Private Sub ButtonGO_Click(sender As Object, e As EventArgs) Handles ButtonGO.Click 
     Me.Hide() 
     Form2.Show() 
    End Sub 
End Class 

Public Class Form2 
    Dim calls As Integer = 0 
    Private Sub Form2_VisibleChanged(sender As Object, e As EventArgs) Handles Me.VisibleChanged 
     calls += 1 
     MsgBox("calling : " & calls & "/Me.Visible : " & Me.Visible) 
     If Me.Visible Then 
      Me.Hide() 
      Form1.Show() 
     End If 
    End Sub 
End Class 
+0

顯然從一個VisibleChanged處理函數調用Me.Hide會在原始處理程序返回後再次發生該事件。也就是說,調用'Hide'會導致立即嵌套的'VisibleChanged'像它應該,第二個處理程序退出什麼都不做,控制繼續到'Form1.Show'並退出原始處理程序,然後再次發生'VisibleChanged'。我不確定這是一個錯誤還是某種模糊但預期的,但如果你想讓它停止,我建議你從其他事件調用'Me.Hide',而不是'VisibleChanged'。 – GSerg

+1

Winforms中的Visible屬性是一個非常重要且非常不直觀的屬性。將其設置爲True(或調用Show,同樣的事情)會產生很多副作用,這是Winforms用來創建本機窗口的觸發器。有一件事你不能做的就是在地板墊上猛地一下,並且在任何由於窗戶被創建或顯示而運行的事件中將其重新設置爲False。當你發現了。目前還不清楚爲什麼要這樣做,但打敗Show()的唯一方法是在調用MyBase.SetVisibleCore()之前,重寫SetVisibleCore()並將參數設置爲False。 –

+0

嗨hans。這個結論的關鍵是要執行一些檢查,如果它們失敗,表單將拒絕顯示。我清楚地看到,這可以在調用form2.show之前完成。但是,我的觀點是要理解我偶然發現的奇怪行爲。現在我嘗試用'Me.SetVisibleCore(False)'替換form2中的'Me.hide()',並且我仍然得到相同的行爲。我弄錯你了嗎? – user3617487

回答

0

好了,爲了關閉:謝謝您的回答,他們分不清什麼爲「全」 VB編碼器做。

至於我的學生,即只使用拖放-VB的人,解決方案是檢查Form1中的條件,然後只有當它顯示時調用Form2。

注意:這可能看起來微不足道,但它可能不符合「封裝」的想法。這就是爲什麼這個問題首先在我的情況。