2019-10-02に投稿

【VB.NET】DataGridView を直接変更してデータを更新してみる

今回は、データグリッドビューの内容を直接編集してデータを更新したいと思います。

プログラムは例によって前回のものを。
【VB.NET】SQLiteに接続してデータを登録してみる

プログラム修正

検索処理

取得したデータを走査して1行ずつ作成していくように変更します。

        ''' <summary>
        ''' 検索処理
        ''' </summary>
        Private Sub search()
            Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")

                ' データベースオープン
                conn.Open()

                ' 検索条件を指定してデータを取得
                Using con As New DataContext(conn)
                    Dim searchName As String = txtName.Text
                    Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd

                    ' 種別マスタ取得
                    Dim kinds As Table(Of Kind) = con.GetTable(Of Kind)
                    Dim kindResult As IQueryable(Of Kind) = From x In kinds Order By x.KindCd Select x
                    Dim kindList = kindResult.ToList()

                    ' 猫一覧取得
                    Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat)
                    Dim result As IQueryable(Of Cat)

                    If (searchKind = "") Then

                        ' 種別が選択されていなければ名前のみ前方一致指定
                        result = From x In tblCat
                                 Where x.Name.StartsWith(searchName)
                                 Order By x.No
                                 Select x
                    Else

                        ' 種別が選択されていれば名前+種別で検索
                        result = From x In tblCat
                                 Where x.Name.StartsWith(searchName) &amp; x.KindCd = searchKind
                                 Order By x.No
                                 Select x
                    End If

                    ' データグリッドビューに設定
                    'dgvCat.DataSource = result.ToList()
                    Dim list As List(Of Cat) = result.ToList()
                    Dim i As Integer = 0
                    dgvCat.Rows.Clear()
                    For i = 0 To list.Count() - 1

                        Dim cat = list(i)

                        ' 行追加
                        dgvCat.Rows.Add()

                        ' No(プライマリなので編集不可)
                        Dim no = New DataGridViewTextBoxCell()
                        no.Value = cat.No
                        dgvCat(0, i) = no
                        dgvCat(0, i).ReadOnly = True

                        ' 名前
                        Dim name = New DataGridViewTextBoxCell()
                        name.Value = cat.Name
                        dgvCat(1, i) = name

                        ' 性別
                        Dim sex = New DataGridViewComboBoxCell()
                        sex.Items.AddRange({"♂", "♀"})
                        sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
                        dgvCat(2, i) = sex
                        dgvCat(2, i).Value = cat.Sex

                        ' 年齢
                        Dim age = New DataGridViewTextBoxCell()
                        age.Value = cat.Age
                        dgvCat(3, i) = age

                        ' 種別
                        Dim kind = New DataGridViewComboBoxCell()
                        kind.DataSource = kindList
                        kind.DisplayMember = "KindName"
                        kind.ValueMember = "KindCd"
                        kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
                        dgvCat(4, i) = kind
                        dgvCat(4, i).Value = cat.KindCd

                        ' 好物
                        Dim favorite = New DataGridViewTextBoxCell()
                        favorite.Value = cat.Favorite
                        dgvCat(5, i) = favorite

                    Next

                End Using

                ' データベースクローズ
                conn.Close()

            End Using
        End Sub

 

更新処理

データグリッドビューに表示されているデータを全て更新するように変更します。

    ''' <summary>
    ''' 更新ボタンクリックイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click

        Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")

            ' データベースオープン
            conn.Open()

            ' データ更新
            Using con As New DataContext(conn)
                ' 対象のテーブルオブジェクトを取得
                Dim Table = con.GetTable(Of Cat)
                ' 選択されているデータを取得
                For i = 0 To dgvCat.Rows.Count - 1
                    ' テーブルから対象のデータを取得
                    Dim no As Integer = dgvCat(0, i).Value
                    Dim target As Cat = Table.Single(Function(x As Cat) x.No = no)
                    ' データ変更
                    target.Name = dgvCat(1, i).Value
                    target.Sex = dgvCat(2, i).Value
                    target.Age = dgvCat(3, i).Value
                    target.KindCd = dgvCat(4, i).Value
                    target.Favorite = dgvCat(5, i).Value
                    ' DBの変更を確定
                    con.SubmitChanges()
                Next

            End Using

            conn.Close()
        End Using

        ' データ再検索
        search()
        MessageBox.Show("データを更新しました。")

    End Sub

コンボボックスの制御

以前の記事でもやりましたが、
コンボボックスがワンクリックで開くように仕込みを入れます。

    ''' <summary>
    ''' データグリッドビューセルクリックイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub dgvCat_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvCat.CellClick
        Dim dgv As DataGridView = CType(sender, DataGridView)
        gridComboHandle(dgv, e)
    End Sub

    ''' <summary>
    ''' データグリッドビューのコンボボックス制御
    ''' </summary>
    ''' <param name="dgv"></param>
    ''' <param name="e"></param>
    Private Sub gridComboHandle(dgv As DataGridView, e As DataGridViewCellEventArgs)

        ' 対象の列だった場合
        If dgv.Columns(e.ColumnIndex).Name = "ColSex" Or dgv.Columns(e.ColumnIndex).Name = "ColKind" Then
            SendKeys.SendWait("{F4}")
        End If

    End Sub

起動してみる

データ検索後

データ検索後の画面。
無事にデータが表示され、データグリッドビューにコンボボックスも表示されています。

データ変更

1行目の種別を変更して、「更新」ボタンをクリックします。

データ変更後

無事に変更できました。

まとめ

やり方としてはいまいちで、WPFみたいにMVVMとかバインディングとかできるかと思いますが、これはこれでもしかしたら需要があるかもしれません。

次回は追加処理をしてみます。

ではでは。

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント