2017-05-17 10 views
3

を要求せずに、私はこの単純なケースに私の問題を縮小しているが、何が起こっているのかを見つけるように見えることはできません。VBフォームが再登場

  • 私は2つのボタンで上のフォーム、および持っていますそれ以外の空。再びボタンをクリックすると
  • 、Form1の皮およびForm2の
  • アップshowungとき、Form2のは非表示になりますを示しており、ショーをForm1

またVisibleChangedを入力するとき、Form2がMsgBoxに ザ・で停止しますコードが続きます。

は今、期待される動作は、ボタンをクリックしたときには、

  • Form1が見えるが原因Form1が起因して偽回す見えるため
  • 第二のMsgBox Form2.showを呼び出すには、真の転換のために
  • 最初のMsgBoxを隠しだろうForm2が呼び出しMe.hide
  • Form1が

このすべて行い起こっを示したが、その後、

  • Form2のは、(Form1がまだそこにある)
  • のMsgBoxが
  • (今偽form2.visibleであることを伝える)のMsgBoxが現れ
  • (再び真form2.visibleであることを伝える)までを示して現れ
  • Form2が

任意のアイデア理由を隠し?あなたの答えに感謝し、彼らは "完全な" VBコーダのために何をすべきかを伝える:閉じるためになるよう、

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'が呼び出され、2番目のハンドラは何もせずに終了し、コントロールは 'Form1.Show'に進み、元のハンドラを終了し、再び' VisibleChanged'が発生します。私はそれがバグか不明確なものかどうかは分かりませんが、もしそれを止めたいのであれば、あなたは 'VisibleChanged'ではなく' Me.Hide'と呼ぶことをお勧めします。 – GSerg

+1

WinformsのVisibleプロパティは非常に大きな問題であり、非常に直感的ではありません。これをTrueに設定する(またはShowを呼び出す、同じこと)には多くの副作用があります。これは、Winformsがネイティブウィンドウを作成するために使用するトリガーです。あなたがすることができない1つのことは、フロアマットを突っ走り、ウィンドウが作成または表示されるために実行されるすべてのイベントでFalseに戻すことです。あなたが知ったように。なぜこれを求めているのかは明らかではありませんが、Show()を無効にする唯一の方法はSetVisibleCore()をオーバーライドし、MyBase.SetVisibleCore()を呼び出す前に引数をFalseに設定することです。 –

+0

こんにちは。この閉鎖のポイントは、いくつかの小切手が実行されることであり、失敗すると、フォームは表示されなくなります。私は明らかにこれがform2.showを呼び出す前に行うことができます参照してください。しかし、私のここでのポイントは、私が遭遇したその奇妙な行動を理解することでした。今私は 'Me.SetVisibleCore(False)'とform2の 'Me.hide()'を置き換えようとしましたが、私はまだ同じ動作をします。私はあなたを間違ってしまいましたか? – user3617487

答えて

0

OK:ここ

コードです。

私の学生、つまりドラッグアンドドロップVBを使用している人は、Form1の条件を確認し、次にのみが表示されたらForm2を呼び出します。

注:これは簡単ではないかもしれませんが、「カプセル化」のアイデアに準拠していない可能性があります。それが私の場合、最初にこの問題を引き起こしたのです。