今回は、データグリッドビューの内容を直接編集してデータを更新したいと思います。
プログラムは例によって前回のものを。
【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) & 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とかバインディングとかできるかと思いますが、これはこれでもしかしたら需要があるかもしれません。
次回は追加処理をしてみます。
ではでは。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント