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
「VisibleChanged」ハンドラから「Me.Hide」を呼び出すと、元のハンドラが復帰してからもう一度イベントが発生します。つまり、 'Hide'を呼び出すとすぐにネストされた' VisibleChanged'が呼び出され、2番目のハンドラは何もせずに終了し、コントロールは 'Form1.Show'に進み、元のハンドラを終了し、再び' VisibleChanged'が発生します。私はそれがバグか不明確なものかどうかは分かりませんが、もしそれを止めたいのであれば、あなたは 'VisibleChanged'ではなく' Me.Hide'と呼ぶことをお勧めします。 – GSerg
WinformsのVisibleプロパティは非常に大きな問題であり、非常に直感的ではありません。これをTrueに設定する(またはShowを呼び出す、同じこと)には多くの副作用があります。これは、Winformsがネイティブウィンドウを作成するために使用するトリガーです。あなたがすることができない1つのことは、フロアマットを突っ走り、ウィンドウが作成または表示されるために実行されるすべてのイベントでFalseに戻すことです。あなたが知ったように。なぜこれを求めているのかは明らかではありませんが、Show()を無効にする唯一の方法はSetVisibleCore()をオーバーライドし、MyBase.SetVisibleCore()を呼び出す前に引数をFalseに設定することです。 –
こんにちは。この閉鎖のポイントは、いくつかの小切手が実行されることであり、失敗すると、フォームは表示されなくなります。私は明らかにこれがform2.showを呼び出す前に行うことができます参照してください。しかし、私のここでのポイントは、私が遭遇したその奇妙な行動を理解することでした。今私は 'Me.SetVisibleCore(False)'とform2の 'Me.hide()'を置き換えようとしましたが、私はまだ同じ動作をします。私はあなたを間違ってしまいましたか? – user3617487