tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル2回 Buttonのクリックイベントが発生します
記事No5916
投稿日: 2007/07/25(Wed) 15:18
投稿者ひでと
お世話になります
ボタンのクリックイベントに別のフォームをShowDialogさせています。
ボタンをクリックして対象のフォームを開き 対象のフォームで閉じる操作を
しています。
対象フォームが閉じるときに、なぜか2回目のボタンのクリックイベントが発生してしまいます。

不思議なことに 他のプロシージャからボタンのクリックイベントを呼び出している訳では
ないのです。しかも2回目に対象フォームを閉じる操作をすると正常に終了されます。

漠然として申し訳ないのですが、クリックイベントを引き起こす可能性のある、
他のイベントについて、ご助言いたたきたいのですが。
再現性のある短いコードが作れず申し訳ないのですが、ヒントをいただきたいのです。

[ツリー表示へ]
タイトルRe: 2回 Buttonのクリックイベントが発生します
記事No5917
投稿日: 2007/07/25(Wed) 15:47
投稿者魔界の仮面弁士
> ボタンのクリックイベントに別のフォームをShowDialogさせています。
Form1 に Button1 があって、
    Private Sub Button1_Click(…
        Using F As New Form2()
            F.ShowDialog()
        End Using
    End Sub
のようなコードを書いている、ということでしょうか?

そこで、Form2 を ShowDialog している、と。

> ボタンをクリックして対象のフォームを開き
さらにボタンクリック? 先の Form1.Button1 のことでしょうか。それとも Form2 のボタン?

> 対象のフォームで閉じる操作をしています。
どのように? 右上の×ボタンですか? あるいはプログラムから閉じている?

> 対象フォームが閉じるときに、なぜか2回目のボタンのクリックイベントが発生してしまいます。
[呼び出し履歴ウィンドウ]に、そのイベントの呼び出し元が表示されますか?

> 不思議なことに 他のプロシージャからボタンのクリックイベントを呼び出している訳では
> ないのです。しかも2回目に対象フォームを閉じる操作をすると正常に終了されます。
1 回目のフォームと、2 回目のフォームは、同一のインスタンスですか?

[ツリー表示へ]
タイトルRe^2: 2回 Buttonのクリックイベントが発生します
記事No5918
投稿日: 2007/07/25(Wed) 16:20
投稿者ひでと
ありがとうございます。
再現が出来ないのですが ボタンに関係したコードを簡略にすると
以下のような感じになりま。ただしこのコードは正常に機能しているようなので
原因は他にあるのかもしれません。
実際はForm1上に複数のボタンを配置して、共通のイベントを与えたつもりです。

Public Class Form1
    Private Fom As Form
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim con As Control
        For Each con In Me.Controls
            If TypeOf con Is Button Then
                AddHandler con.GotFocus, AddressOf Button_GotFocus
                    AddHandler con.Click, AddressOf Button_Click
            End If
        Next
    End Sub
    Private Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Fom.ShowDialog()
    End Sub
    Private Sub Button_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
        Fom = Form2 '実際はForm1の押されたボタンによって
          ' Fom=Form3 のように処理を分岐しています
    End Sub
End Class


Public Class Form2
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Dispose()
    End Sub
End Class

[ツリー表示へ]
タイトルRe^2: 2回 Buttonのクリックイベントが発生します
記事No5919
投稿日: 2007/07/25(Wed) 16:31
投稿者ひでと
> > 対象フォームが閉じるときに、なぜか2回目のボタンのクリックイベントが発生してしまいます。
> [呼び出し履歴ウィンドウ]に、そのイベントの呼び出し元が表示されますか?
>
> > 不思議なことに 他のプロシージャからボタンのクリックイベントを呼び出している訳では
> > ないのです。しかも2回目に対象フォームを閉じる操作をすると正常に終了されます。
> 1 回目のフォームと、2 回目のフォームは、同一のインスタンスですか?

申し訳ないのですが[呼び出し履歴ウィンドウ]使ったことがなくてすぐにはご返事できません
同一のインスタンスかについてですが、1度目に現れたフォームのTextBoxの数字を変更して
みたところ、2番目にあらわれたフォームでは反映されていなかった為
別のインスタンスだと思います。

[ツリー表示へ]
タイトル自己解決しました 申し訳ありません
記事No5921
投稿日: 2007/07/26(Thu) 09:18
投稿者ひでと
自己解決いたしました。原因は以下でした。
Fom1のボタン群に共通するイベントを付けようと以下のコードを入れていました。
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim con As Control
        For Each con In Me.Controls
            con.TabStop = False
            If TypeOf con Is Button Then
                If con.Tag <> "" Then
                    AddHandler con.GotFocus, AddressOf Button_GotFocus
                    AddHandler con.Click, AddressOf Button_Click
                End If
            End If
        Next
    End Sub
しかし ボタンのクリック処理を入れようとして
    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Fom.ShowDialog()
    End Sub
と入れてしまったため
Button1のクリックイベントを2重に定義してしまっていたことにありました。
Handles Button1.Clickを削除すると正常に機能いたしました。
お騒がせして申し訳なく思っています。反省しています。

[ツリー表示へ]