VB.NETでCSVテキストファイルを読み込む

VB.NETでCSVファイルを読み込みにはというクラスを使えば、CSVを読み込んで各行の各フィールドの文字列を簡単に取り出すことができます。

TextFieldParserクラスを使用してCSVファイルを読み込むには、処理したいCSVファイルをコンストラクタで指定してインスタンスを作成する必要があります。

TextFieldParserクラスのコンストラクタ呼び出し

Imports Microsoft.VisualBasic.FileIO

Public Class Module1
    Private Sub csv_load()
        Dim parser As New TextFieldParser("C:\Users\ks420\Desktop\csvtext.txt",
             System.Text.Encoding.GetEncoding("Shift_JIS"))
    End Sub
End Class

フィールド間がコンマで区切られている設定

Imports Microsoft.VisualBasic.FileIO

Public Class Module1
    Private Sub csv_load()
        parser.TextFieldType = FieldType.Delimited
        parser.SetDelimiters(",")
    End Sub
End Class

テスト用CSVテキストファイル

テスト用にこのようなCSVファイルを用意しました。

1,1行目,1行目の3個目
2,2行目,2行目の3個目
3,3行目,3行目の3個目
4,4行目,4行目の3個目
5,5行目,5行目の3個目

CSVファイルを読み込んでコンソールに表示するプログラム

Imports Microsoft.VisualBasic.FileIO

Public Class Module1
        Using parser As New TextFieldParser("C:\Users\ks420\Desktop\csvtext.txt",
             System.Text.Encoding.GetEncoding("Shift_JIS"))

            parser.TextFieldType = FieldType.Delimited
            parser.SetDelimiters(",")

            While Not parser.EndOfData
                Dim row As String() = parser.ReadFields()

                Console.WriteLine(row(0) & " " & row(1) & " " & row(2))
            End While
        End Using
End Class

CSVファイルの全ての行を1行づつ読んでコンソールに表示しています。

このように表示されます。

1 1行目 1行目の3個目
2 2行目 2行目の3個目
3 3行目 3行目の3個目
4 4行目 4行目の3個目
5 5行目 5行目の3個目

VB.NETのお勉強の教材

VB.NET教材プログラミング初心者から中級者まで実戦に役立つ内容を分かりやすく解説しています。

VB.NETでDataGridViewを使う

DataGridViewコントロールはさまざまな種類のデータ ソースのデータを表形式で表示し、編集したりすることが可能です。

又、データ ソースをバインドせずに動作させることも可能です。

拡張性に優れていてカスタマイズに柔軟なコントロールです。

しかし、便利で優れたコントロールではあるが柔軟ではならでは不都合も発生する場合があります。

それは、エンドユーザーの操作により表の幅や高さ、並び替え等の形状等の変更が可能になり、場合によっては仕様上で邪魔にになってくることがあります。

そこで、エンドユーザーがDataGridViewに対する操作を制限する方法やテーブルの常時の仕方などを紹介します。

ヘッダーの高さ・幅を変更できないようにする

Me.DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
Me.DataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing

セルの高さ・幅を変更できないようにする

Me.DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
Me.DataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing

並び替え(ソート)をできないようにする

For Each c As DataGridViewColumn In Me.DataGridView.Columns
    c.SortMode = DataGridViewColumnSortMode.NotSortable
Next c

複数行の選択ができないようにする

Me.DataGridView.MultiSelect = False

列ヘッダーに表示する文字列を設定する

Me.DataGridView.Columns(0).HeaderText = "コード"
Me.DataGridView.Columns(1).HeaderText = "名称"

列ヘッダーのスタイル設定

Me.DataGridView.Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
Me.DataGridView.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

行ヘッダーの幅を設定する

Me.DataGridView.RowHeadersWidth = 20

セルの幅を設定する

Me.DataGridView.Columns(0).Width = 40
Me.DataGridView.Columns(1).Width = 140

セルの書式を設定する

Me.DataGridView.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
Me.DataGridView.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

データソースの列名割り付け

Me.DataGridView.Columns(0).DataPropertyName = "CODE"
Me.DataGridView.Columns(1).DataPropertyName = "NAME"

テーブルの内容を表示する

Dim ad As New SqlClient.SqlDataAdapter
Dim ds As New DataSet
Dim sql As String

sql = ""
sql &= "SELECT"
Sql &= "        列名1,"
sql &= "        列名2"
sql &= "    FROM"
sql &= "        テーブル名"
ad = New SqlClient.SqlDataAdapter(sql, cnSring)
ad.Fill(ds)
Me.DataGridView.DataSource = ds.Tables(0)
ds.Dispose()
ad.Dispose()

DataGridViewでEnterキーでTabキーと同じ動作をする

DataGridViewでEnterキーを押したらTabキーと同様の動作、次のフィールドにフォーカスを移す方法です。
クラスを作成して、ビルド、又はリビルドしたらルールボックスにカスタムDataGridViewとして現れ、通常のDataGridViewのように使用できます。

Public Class MyDataGridView
    Inherits DataGridView

    Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
        If (keyData And Keys.KeyCode) = Keys.Enter Then
            Return Me.ProcessTabKey(keyData)
        Else
            Return MyBase.ProcessDialogKey(keyData)
        End If

    End Function

    Protected Overrides Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) As Boolean
        If e.KeyCode = Keys.Enter Then
            Return Me.ProcessTabKey(e.KeyCode)
        Else
            Return MyBase.ProcessDataGridViewKey(e)
        End If
    End Function
End Class

VB.NETのお勉強の教材

VB.NET教材プログラミング初心者から中級者まで実戦に役立つ内容を分かりやすく解説しています。

VB.NETでSQL ServerのSQL文を実行する

VB.NETのプログラムでSQL Serverに接続してSQL文を実行する解説です。

この記事ではSQL Serverのデータベースに接続し、「SELECT」、「INSERT」、「UPDATE」、「DELETE」を実行する内容を例にしています。

戻り値が必要な場合は「ExecuteReader」を使い、戻り値が必要無い場合は「ExecuteNonQuery」を使用します。

SQL Serverのデータベースに接続する

Dim cn As New SqlClient.SqlConnection

cn.ConnectionString = 接続文字列
cn.Open()

'---- ↓ ----
この間でSQL文を実行する
'---- ↑ ----

cn.Close()
cn.Dispose()

最後にクローズと解放をお忘れなく!!

cn.Close()
cn.Dispose()

SQL Serverのデータベースに接続する「接続文字列」

接続文字列とはSQL Serverのデータベースにログインするのに必要な情報をルールに基づいて羅列した文字列です。

Data Source = IPアドレス等のロケーション\SQLEXPRESS;User ID = ユーザID;Password = パスワード;Initial Catalog = カレントデータベース名;” この様な定義とします。

これらの内容を変数に定義します。

ここでは変数「cnStaring」に接続文字列を定義します。

Dim cnStaring As String

cnString = ""
cnString &= "Data Source =IPアドレス等のロケーション\SQLEXPRESS;"
cnString &= "User ID = ユーザID;"
cnString &= "Password = パスワード;"
cnString &= "Initial Catalog = データベース名;"

テーブルの内容を取得する

テーブルの内容を取得するには「SELECT句」を「ExecuteReader」で使います。

Dim cn As New SqlClient.SqlConnection
Dim cd As New SqlClient.SqlCommand
Dim dr As SqlClient.SqlDataReader
Dim SQL As String

'データベース接続
cn.ConnectionString = "データベース接続文字列"
cn.Open()
'SQL文生成
SQL = ""
SQL &= "SELECT"
SQL &= "        *"
SQL &= "    FROM"
SQL &= "        テーブル名"
'SQLコマンド設定
cd.CommandText = SQL
cd.Connection = cn
dr = cd.ExecuteReader
While dr.Read
    Console.Write(dr("列名1"))
    Console.Write(dr("列名2"))
End While
'クローズ解放
dr.Close()
cd.Dispose()
cn.Close()
cn.Dispose()

このSQL文ではコンソールに列名1と列名2の内容が表示されます。

このようにテーブルの内容(戻り値)が必要な場合は「ExecuteReader」を使用することで可能になります。

テーブルに行(レコード)を追加する

テーブルに新たな行(レコード)を追加するには「INSERT句」を「ExecuteNonQuery」で使用します。

Dim cn As New SqlClient.SqlConnection
Dim cd As New SqlClient.SqlCommand
Dim SQL As String

'データベース接続
cn.ConnectionString = "データベース接続文字列"
cn.Open()
'SQL文生成
SQL = ""
SQL &= "INSERT  INTO    テーブル名"
SQL &= "("
SQL &= "    列名1,"
SQL &= "    列名2,"
SQL &= "    列名3"
SQL &= ")"
SQL &= "VALUES"
SQL &= "("
SQL &= "    1,"
SQL &= "    100,"
SQL &= "   'テスト文字列'"
SQL &= ")"
'SQLコマンド設定
cd.CommandText = SQL
cd.Connection = cn
cd.ExecuteNonQuery()
'クローズ解放
cd.Dispose()
cn.Close()
cn.Dispose()

これでテーブル「テーブル名」に1行追加できます。

他テーブルの内容で行を追加する

先ほどは固定値で行(レコード)を追加しましたが、今度は他のテーブルの内容で行を追加しましょう。

Dim cn As New SqlClient.SqlConnection
Dim cd As New SqlClient.SqlCommand
Dim SQL As String

'データベース接続
cn.ConnectionString = "データベース接続文字列"
cn.Open()
'SQL文生成
SQL = ""
SQL &= "INSERT  INTO    テーブル名A"
SQL &= "("
SQL &= "    列名A1,"
SQL &= "    列名A2,"
SQL &= "    列名A2"
SQL &= ")"
SQL &= "    SELECT"
SQL &= "            列名B1,"
SQL &= "            列名B2,"
SQL &= "            列名B3"
SQL &= "        FROM"
SQL &= "            テーブル名B"
'SQLコマンド設定
cd.CommandText = SQL
cd.Connection = cn
cd.ExecuteNonQuery()
'クローズ解放
cd.Dispose()
cn.Close()
cn.Dispose()

これはテーブル名Bの内容をテーブル名Aに追加します。

テーブルの内容を更新する

テーブルの内容を更新するには「UPDATE句」を「ExecuteNonQuery」で使用します。

Dim cn As New SqlClient.SqlConnection
Dim cd As New SqlClient.SqlCommand
Dim SQL As String

'データベース接続
cn.ConnectionString = "データベース接続文字列"
cn.Open()
'SQL文生成
SQL = ""
SQL &= "UPDATE  テーブル名"
SQL &= "    SET 列名2      =   200,"
SQL &= "        列名3      =   '文字列修正の値'"
SQL &= "    WHERE"
SQL &= "        列名1  =   1"
'SQLコマンド設定
cd.CommandText = SQL
cd.Connection = cn
cd.ExecuteNonQuery()
'クローズ解放
cd.Dispose()
cn.Close()
cn.Dispose()

テーブル「テーブル名」の列名2と列名3の内容を変更します。

テーブルの行(レコード)を削除する

行(レコード)を削除するには「DELETE句」を「ExecuteNonQuery」で使用します。

Dim cn As New SqlClient.SqlConnection
Dim cd As New SqlClient.SqlCommand
Dim SQL As String

'データベース接続
cn.ConnectionString = "データベース接続文字列"
cn.Open()
'SQL文生成
SQL = ""
SQL &= "DELETE"
SQL &= "    FROM"
SQL &= "        テーブル名"
SQL &= "    WHERE"
SQL &= "        列名1  =   1"
'SQLコマンド設定
cd.CommandText = SQL
cd.Connection = cn
cd.ExecuteNonQuery()
'クローズ解放
cd.Dispose()
cn.Close()
cn.Dispose()

テーブル「テーブル名」の列名1が1の行(レコード)を削除します。

VB.NETのお勉強の教材

VB.NET教材プログラミング初心者から中級者まで実戦に役立つ内容を分かりやすく解説しています。

VB.NETでユーザーによるForm操作を制限する

VB.NETのプログラムの大半はFormを使用することになります。

Formは便利なのですが、エンドユーザーが様々な操作が可能になっています。

例えばサイズの変更であったり、「✕」閉じるボタンでフォームを閉じたりすることが出来るのですが、場合によってはプログラムの仕様に弊害を与え、ややこしい仕様を追加する必要が発生することがあります。

だったら最初からそのような機能を無効化したほうがスッキリした仕様でプログラミングとなります。

Formを仕様した場合に最低限していることを紹介しましょう。

コントロールボックスの最大化ボタンを無効化

MaximizeBoxプロパティの操作で無効化できます。

Loadイベントに装備したらいいでしょう。

Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Window最大化ボタン非表示
    Me.MaximizeBox = False
End Sub

Formのサイズ変更無効化

FormBorderStyleプロパティを設定すればサイズ変更できなくなります。

これも、Loadイベントで行った方がいいでしょう。

Private Sub FMTOKUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Windowサイズ変更禁止
    Me.FormBorderStyle = FormBorderStyle.FixedSingle
End Sub

コントロールボックスの「✕」閉じるボタンを無効化

フォームのCreateParamsプロパティをオーバーライドして「閉じる」ボタンを無効状態にし、システムメニューの「閉じる」も表示されず、「Alt」+「F4」キーも無効にします。

Protected Overrides ReadOnly Property CreateParams As CreateParams
    Get
        Dim c = MyBase.CreateParams

        c.ClassStyle = c.ClassStyle Or &H200
        Return c
    End Get
End Property

このコードをFormの「Class 」内にコーディングすれば「×」閉じるボタンを無効化できます。

VB.NETのお勉強の教材

VB.NET教材プログラミング初心者から中級者まで実戦に役立つ内容を分かりやすく解説しています。

VB.NETでSQL ServerのTimestamp型をString型に変換

SQL Serverのシステム型で用意されているTimestamp型は行の世代を示す列で、行に何等かの更新が発生すると自動的に値が変更されます。

更新の有無を把握する型であり、取得済のTimestampの値とテーブルの行に存在するTimestampの値に違いがあれば、その行に何等かの更新があったことになります。

SQL文内であればTimestamp値を比較することは可能ですが、TimeStamp値はByte配列として格納されているため、プログラムで扱える型に変換してから使うようになります。

そこで、TimeStampの値を文字列に変換する方法を紹介します。

TimeStamp型の値を文字列に変換するコード

TimeStamp型の値を受け取り、文字列に変換して戻すコードです。

プロジェクトどこからでも使用できるように「Public Function」で定義しましょう。

Module Module1
    Public Function timestamptostring(tm As Byte()) As String
        Dim i As Integer
        Dim txTimestamp As String = "0x"

        For i = 0 To tm.Length - 1
            txTimestamp &= Hex(tm(i)).PadLeft(2, "0")
        Next

        Return (txTimestamp)
    End Function
End Module 

TimeStamp型を文字列に変換するコードの使い方

Private Sub TimestampTest()
    Dim TxTs as String

    TxTs  = timestamptostring(Timestamp型)
End sub

 

VB.NETのお勉強の教材

VB.NET教材プログラミング初心者から中級者まで実戦に役立つ内容を分かりやすく解説しています。

VB.NETのFormで「Enter」キーでフォーカスを移動する

VB.NETのFORMは通常、「Tab」キーで次の「TabIndex」にフォーカスが移動する仕様となっています。

その理由は「Enter」キーには別の機能が備わっているからです。

「Enter」で「Tab」キーと同様にフォーカスを移動させることになると、「Enter」本来の機能を無効化することになります。

「Enter」本来の機能を無効化しても大きな問題は発生しないと思います。

事実、これまでに不満感じることはありませんでした。

「Enter」キーでフォーカスを移すコード

Formの「KeyDown」イベントに装備します。

Private Sub Form_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    If e.KeyCode = Keys.Enter Then
        If e.Control = False Then
            Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
        End If
    End If
End Sub

「KeyPreview」プロパティの有効化

先ほどのコードを装備して、実行しても「Enter」キーでフォーカスが移動しません。

コードを実行するに先立って「KeyPreview」プロパティを「有効」にしないと正常に動作しないのです。

次のコードはFormの「Load」イベントで「KeyPreview」プロパティを「有効」にする例です。

Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.KeyPreview = True
End Sub

「KeyPreview」プロパティを「有効」にすることで「Enter」でフォーカスの移動できるようになりました。

ビープ音の停止

このままですと「Enter」キーを押す度にビープ音が鳴ってしまいます。

イベントを強制的に発生させているためなので、キーイベントが処理されたことにしてしまいます。

Formの「KeyPress」イベントに装備します。

Private Sub Form_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    If e.KeyChar = ControlChars.Cr Then
        e.Handled = True
    End If
End Sub

実装後のキーボード操作

「Enter」で次のTabIndexを持つコントロールに移動します。

「Shift」+「Enter」前のTabIndexを持つコントロールに移動します。

MultiLineのテキストボックスでの改行は「Ctrl」+「Enter」で対応できます。

VB.NETのお勉強の教材

VB.NET教材プログラミング初心者から中級者まで実戦に役立つ内容を分かりやすく解説しています。