2019-10-03に投稿

【VB.NET】DataGridView の行を動的に追加してみる

引き続き、DataGridView関連の話し。
今回は行を動的に追加する方法を試してみてました。

プログラムは前回のものを流用します。
【VB.NET】DataGridView を直接変更してデータを更新してみる

プログラム修正

追加処理

追加ボタンが押されたタイミングで、データグリッドビューの空行を作成して追加します。

今回は、1行追加したら「更新」するまで追加できないようにしました。
(グローバルでフラグを持たせています)

    ''' <summary>
    ''' 追加ボタンクリックイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click

        ' 追加後に更新されていなければ処理しない
        If (AddRowFlg) Then
            Return
        End If

        AddRowFlg = True

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

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

            ' データ追加
            Using con As New DataContext(conn)

                Dim idx = dgvCat.Rows.Count()

                ' 行追加
                dgvCat.Rows.Add()

                ' 種別マスタ取得
                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 newNo = 0

                ' 使用できるNoを判定
                For i As Integer = 1 To tblCat.ToList().Count() + 1
                    Dim selectNo = i
                    If tblCat.SingleOrDefault(Function(x As Cat) x.No = selectNo) Is Nothing Then
                        newNo = selectNo
                    End If
                Next

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

                ' 名前
                Dim name = New DataGridViewTextBoxCell()
                dgvCat(1, idx) = name

                ' 性別
                Dim sex = New DataGridViewComboBoxCell()
                sex.Items.AddRange({"&#x2642;", "&#x2640;"})
                sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
                dgvCat(2, idx) = sex

                ' 年齢
                Dim age = New DataGridViewTextBoxCell()
                dgvCat(3, idx) = age

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

                ' 好物
                Dim favorite = New DataGridViewTextBoxCell()
                dgvCat(5, idx) = favorite

            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.SingleOrDefault(Function(x As Cat) x.No = no)
                    If (target Is Nothing) Then
                        ' データ作成
                        Dim Cat As New Cat()
                        Cat.No = dgvCat(0, i).Value
                        Cat.Name = dgvCat(1, i).Value
                        Cat.Sex = dgvCat(2, i).Value
                        Cat.Age = dgvCat(3, i).Value
                        Cat.KindCd = dgvCat(4, i).Value
                        Cat.Favorite = dgvCat(5, i).Value
                        Table.InsertOnSubmit(Cat)

                    Else

                        ' データ変更
                        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

                    End If
                    ' DBの変更を確定
                    con.SubmitChanges()
                Next

            End Using

            conn.Close()
        End Using

        AddRowFlg = False

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

    End Sub

 

起動してみる

検索後

とりあえず検索します。

追加ボタンクリック

追加ボタンをクリックすると空行が追加されます。

データを入力

追加された行に値を設定します。

更新ボタンをクリック

更新ボタンをクリック、再検索後の画面が表示されます。

まとめ

年の瀬となり忙しくなってまいりましたが
なんとか更新していきたいと思います。

次回はどうしようかな。。

ではでは。

Originally published at www.doraxdora.com

doraxdora

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

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

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

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

ボードとは?

関連記事

コメント