【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({"♂", "♀"}) 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
起動してみる
とりあえず検索します。
追加ボタンをクリックすると空行が追加されます。
追加された行に値を設定します。
更新ボタンをクリック、再検索後の画面が表示されます。
まとめ
年の瀬となり忙しくなってまいりましたが
なんとか更新していきたいと思います。
次回はどうしようかな。。
ではでは。
ディスカッション
ピンバック & トラックバック一覧
[…] 【VB.NET】DataGridView の行を動的に追加してみる | ドラブロ – let bygones be bygo…VB.NET の WindowsForms で、画面上からデータグリッドビューの行を追加するサンプルです。www.doraxdora.com […]