忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

コントロールの同じイベント処理に複数の関連付けをテスト

フォーム上のラベルコントロールのクリックイベント処理を複数宣言した場合には、 どの様になるのかをテストしてみました。

フォーム上にテキストボックスとラベルコントロールを貼り付けます。 フォームロードイベントでは、テキストボックスの属性を設定し、 最初のラベルクリックイベントを宣言します。
その後、最初のラベルクリックイベントをコピーして2回貼り付けし、 それぞれ別の関数名に直します。
結果、以下の様なソースになります。

コントロールの同じイベント処理に複数の関連付けをテスト

Public Class frmHandler

    ''' 
    ''' フォームロードイベント
    ''' 
    Private Sub frmHandler_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'テキストボックスの設定
        Me.TextBox1.Multiline = True                    '複数行許可
        Me.TextBox1.ScrollBars = ScrollBars.Vertical    'スクロールバー:縦のみ
    End Sub

    ''' 
    ''' ラベルクリックイベント1
    ''' 
    Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
        Me.TextBox1.Text &= "最初のクリック" & vbCrLf
    End Sub

    ''' 
    ''' ラベルクリックイベント2
    ''' 
    Private Sub Label1_Test2_Click(sender As Object, e As EventArgs) Handles Label1.Click
        Me.TextBox1.Text &= "2番目のクリック" & vbCrLf
    End Sub

    ''' 
    ''' ラベルクリックイベント3
    ''' 
    Private Sub Label1_Test3_Click(sender As Object, e As EventArgs) Handles Label1.Click
        Me.TextBox1.Text &= "3番目のクリック" & vbCrLf
    End Sub

End Class

このプログラムを実行し、ラベルをクリックすると以下の様な表示なります。

テキストボックスの表示には、思った様な結果にはなりませんでした。 イベントの発生が、ソースの順番になるのかと思っていたのですが、 イベントの発生順番は、それには依存しない様です。

そこで、Addhandlerでイベント処理を宣言した場合にはどうなるのかと 思い、以下の様にソースを変更してみました。

コントロールの同じイベント処理に複数の関連付けをテスト2

Public Class frmHandler2

    ''' 
    ''' フォームロードイベント
    ''' 
    Private Sub frmHandler_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'テキストボックスの設定
        Me.TextBox1.Multiline = True                    '複数行許可
        Me.TextBox1.ScrollBars = ScrollBars.Vertical    'スクロールバー:縦のみ

        'ラベルクリックイベントに処理関数の関連付け
        AddHandler Me.Label1.Click, AddressOf Label1_Click
        AddHandler Me.Label1.Click, AddressOf Label1_Test2_Click
        AddHandler Me.Label1.Click, AddressOf Label1_Test3_Click
    End Sub

    ''' 
    ''' ラベルクリックイベント1
    ''' 
    Private Sub Label1_Click(sender As Object, e As EventArgs)
        Me.TextBox1.Text &= "最初のクリック" & vbCrLf
    End Sub

    ''' 
    ''' ラベルクリックイベント2
    ''' 
    Private Sub Label1_Test2_Click(sender As Object, e As EventArgs)
        Me.TextBox1.Text &= "2番目のクリック" & vbCrLf
    End Sub

    ''' 
    ''' ラベルクリックイベント3
    ''' 
    Private Sub Label1_Test3_Click(sender As Object, e As EventArgs)
        Me.TextBox1.Text &= "3番目のクリック" & vbCrLf
    End Sub

End Class

このプログラムを実行し、ラベルをクリックすると以下の様な表示なります。

テキストボックスの表示は、思った様な結果なったのですが、 イベントの発生順番についていろいろネットで調べたのですが、 Addhandlerでも保証はされない様です。

とにかく、イベント処理では発生順番に依存せずに処理が問題無く動作する様に組むべきだと思います。

関連する記事

フォーム上のコントロールで[Enter]キー押下で次のコントロールにフォーカス移動する
フォーム上のコントロールのイベント処理の一括関連付け:[AddHandler,DirectCast]
コントロールを配列で処理する方法     :[AddHandler,DirectCast]











PR

コメント

コメントを書く