忍者ブログ

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

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

フォーム上の複数のコントロール(TextBox)の入力変化を確認する方法について

何かのデータをデータベースから読込み TextBox 等に表示し、それぞれ TextBox のいずれかに入力の変更が在ったかどうかを判断する方法を示します。
以下のソースではフォームロードイベント時に仮のデータを初期値として、フォーム上の5個の TextBox に設定しています。 さらに、TextBoxTextChanged イベントで入力が在ったことを処理するため、内部の変更フラグをONしていますが、 そのイベント処理ハンドラを AddHandler により各 TextBox に関連付けています。

仮に【登録】【終了】ボタンを設置し、【登録】ボタン処理では実際の登録はしないのですが、 登録したものとして、変更フラグをOFFとして再初期化しています。 また、【終了】ボタン処理ではフラグを確認して、確認メッセージを表示する様にしています。

フォーム上の複数の TextBox の入力変化を確認する処理

Public Class frmInpCheck

    'データに変更が在った証拠のフラグ
    Private fDirty As Boolean = False

    '【登録】ボタンクリックイベント処理
    Private Sub btnWrite_Click(sender As Object, e As EventArgs) Handles btnWrite.Click
        MsgBox("登録します。")
        '登録処理を以下に記述...

        'フラグをOFF
        Me.fDirty = False
    End Sub

    '【終了】ボタンクリックイベント処理
    Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
        If Me.fDirty = True Then
            If MsgBox("データが変更されています。終了してもよろしいですか?", _
                      MsgBoxStyle.Question + MsgBoxStyle.YesNo, "TEST") = MsgBoxResult.No Then
                'いいえの場合は処理を取止め
                Exit Sub
            End If
        End If

        '自分を閉じる
        Me.Close()
    End Sub

    'フォームロードイベント時処理
    Private Sub frmInpCheck_Load(sender As Object, e As EventArgs) Handles Me.Load
        'フォームロード時に画面のTextBoxを初期化する
        '(一般的にはデータベース等からデータを取得し表示する...)
        Me.TextBox1.Text = "A1234"
        Me.TextBox2.Text = "BBBB"
        Me.TextBox3.Text = "C120000"
        Me.TextBox4.Text = "DDDDDD"
        Me.TextBox5.Text = "EEE"

        'フォームに属するコントロールがTextBoxの場合、TextChangedイベントの処理を関連付ける
        For Each ctrl As Control In Me.Controls
            If TypeOf ctrl Is TextBox Then
                AddHandler CType(ctrl, TextBox).TextChanged, AddressOf event_TextChanged
            End If
        Next
    End Sub

    'TextBoxの内容変化イベント処理
    Private Sub event_TextChanged(sender As Object, e As EventArgs)
        'データの変更フラグON!!
        Me.fDirty = True
    End Sub

End Class

これを実行すると以下の様な表示になります。

TextBox のデータ4を変更し、【終了】ボタンをクリックすると以下の表示になります。



尚、 AddHandler でイベントを関連付けているところを、 イベント処理の SubプロシージャHandlesキーワードの後ろに5個分の TextBox を以下の様に記述しても同じことができます。

TextChangedイベント処理について

    '通常の方法でのTextBoxの内容変化イベント処理
    '(Handles の後ろに必要なコントロールを全て記述することで AddHandler と同様になる)
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles _
            TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged, _
            TextBox4.TextChanged, TextBox5.TextChanged
        'データの変更フラグON!!
        Me.fDirty = True
    End Sub


この方法は見た目にも余りかっこよくないですし、仮に TextBox が増えたりした場合には変更が面倒なのでお勧めしません。 ただ、こんな方法もあるということを示しました。

今回は TextBox のみを例にしましたが、実際は日付入力や CheckBox などもありますので それぞれのコントロールで値が変更されたイベントのタイミングでフラグをONしてやればよいと思います。
CheckBox の場合は、 CheckedChangedイベント)

関連する記事

フォームクラス生成時に設定値を同時に渡す方法
フォーム上の複数のコントロール(TextBox)の入力変化を確認する方法について
フォームのマウスカーソルを待機状態する方法について
フォームクラスの継承の方法について











PR

コメント

コメントを書く