少しだけマスター登録画面を使いやすくする工夫をする

コードを入力したときに、既に登録されているコードならその登録内容を表示して編集できるようにすると、よりユーザビリティが高くなるような気がします。
そのような場合には、入力値の検証イベント(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
これで一通りのマスター登録画面は完成しました。
次回から出荷伝票の登録画面を作成していきます。