【VB.NET】DataGridView を直接変更してデータを更新してみる
おはようございます。
今回は、データグリッドビューの内容を直接編集してデータを更新したいと思います。
プログラムは例によって前回のものを。
スポンサーリンク
プログラム修正
検索処理
取得したデータを走査して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) And 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とかバインディングとかできるかと思いますが、これはこれでもしかしたら需要があるかもしれません。
次回は追加処理をしてみます。
ではでは。
ディスカッション
コメント一覧
お世話になっております。
ここも
search()の35行目
> Where x.Name.StartsWith(searchName) & x.KindCd = searchKind
の&がandでばっちり動くようになりました。
匿名希望様
何度もありがとうございます。
記事を修正いたしました。
今後もよろしくお願いします。
はじめまして。
こちらの記事を参考に自身のものを変更してみましたが
Using con As New DataContext(conn)の部分でDataContextでエラー。
Dim target As Catを自身のテーブル名にしてみたのですがエラーがでてしまいます。なにか考えられる対応ありますでしょうか?