何かのデータをデータベースから読込み TextBox 等に表示し、それぞれ TextBox のいずれかに入力の変更が在ったかどうかを判断する方法を示します。
以下のソースではフォームロードイベント時に仮のデータを初期値として、フォーム上の5個の TextBox に設定しています。 さらに、TextBox の TextChanged イベントで入力が在ったことを処理するため、内部の変更フラグを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)の入力変化を確認する方法について
⇒フォームのマウスカーソルを待機状態する方法について
⇒フォームクラスの継承の方法について
コメント