そのような場合には、入力値の検証イベント(Validating)の部分にコードを仕込んでおくと、都合がよいようです。
よく見かけるサンプルコードでは、文字の変更イベント(TextChanged)の部分にコードを仕込んでいるのをよく見かけますが、データベースと連携するものはイベント発生頻度が高くなりがちなためあまりお勧めではありません。(データベースへの問い合わせでレスポンスが低下する場合があるため)
takeはこのように使い分けています。
- TextChanged:インクリメントサーチをしたいとき
- Validating:完全一致検索のとき
Private Sub tbコード_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles tbコード.Validating
'該当するコードが存在するかチェックして、存在すればそのIDを問い合わせて表示する
'レコードの存在チェック
Dim ID As Integer = RecordExistValidator(tbコード.Text)
If ID > 0 Then 'レコードが存在したら
MsgBox("このコードは既に登録されています。" & vbNewLine & "登録情報を呼び出します。", MsgBoxStyle.Information, "")
Call FormFill(ID)
End If
End Sub
Private Function RecordExistValidator(ByVal コード As String) As Integer
'該当するコードが存在するかチェックして、存在すればそのIDを返す
Dim SqlCommand As New OleDb.OleDbCommand("SELECT ID FROM 住所マスター WHERE コード = @コード;")
SqlCommand.Parameters.Add("@コード", OleDb.OleDbType.Char)
SqlCommand.Parameters("@コード").Value = コード
Dim db As New database.MSAccess.DBAccess
Dim dt As DataTable = db.getDataTable(SqlCommand)
'問い合わせエラー
If IsNothing(dt) Then
Dim ex As Exception = db.SQLException
MsgBox("住所マスターの取り出しに失敗しました。" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Form住所マスタ管理/RecordExistValidator")
Return -1
End If
'該当レコード無し
If dt.Rows.Count = 0 Then
Return 0
End If
Return dt.Rows(0).Item("ID").ToString
End Function
Private Sub FormFill(ByVal ID As Integer)
'該当するIDの情報を取り出す
Dim sbSqlCommand As New System.Text.StringBuilder("")
sbSqlCommand.Append("SELECT コード, 会社名, フリガナ, 部署担当, 郵便番号, 住所1, 住所2, TEL, EMail")
sbSqlCommand.Append(" FROM 住所マスター")
sbSqlCommand.Append(" WHERE ID = @ID;")
Dim SqlCommand As New OleDb.OleDbCommand
SqlCommand.CommandText = sbSqlCommand.ToString
SqlCommand.Parameters.Add("@ID", OleDb.OleDbType.Integer)
SqlCommand.Parameters("@ID").Value = ID
Dim db As New database.MSAccess.DBAccess
Dim dt住所マスター As DataTable = db.getDataTable(SqlCommand)
If IsNothing(dt住所マスター) Then
Dim ex As Exception = db.SQLException
MsgBox("住所マスターの取り出しに失敗しました。" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Form住所マスタ管理/FormFill")
Exit Sub
End If
lblID.Text = ID.ToString
tbコード.Text = dt住所マスター.Rows(0).Item("コード").ToString
tb会社名.Text = dt住所マスター.Rows(0).Item("会社名").ToString
tbフリガナ.Text = dt住所マスター.Rows(0).Item("フリガナ").ToString
tb部署担当.Text = dt住所マスター.Rows(0).Item("部署担当").ToString
tb郵便番号.Text = dt住所マスター.Rows(0).Item("郵便番号").ToString
tb住所1.Text = dt住所マスター.Rows(0).Item("住所1").ToString
tb住所2.Text = dt住所マスター.Rows(0).Item("住所2").ToString
tbTEL.Text = dt住所マスター.Rows(0).Item("TEL").ToString
tbEMail.Text = dt住所マスター.Rows(0).Item("EMail").ToString
tb会社名.Focus()
End Sub
これで一通りのマスター登録画面は完成しました。次回から出荷伝票の登録画面を作成していきます。