【VB.NET】DataGridView を直接変更してデータを更新してみる
おはようございます。
今回は、データグリッドビューの内容を直接編集してデータを更新したいと思います。
プログラムは例によって前回のものを。
スポンサーリンク
プログラム修正
検索処理
取得したデータを走査して1行ずつ作成していくように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | ''' <summary> ''' 検索処理 ''' </summary> PrivateSubsearch() Using conn AsNewSQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con AsNewDataContext(conn) DimsearchName AsString=txtName.Text DimsearchKind AsString=CType(cmbKind.SelectedValue,Kind).KindCd ' 種別マスタ取得 Dimkinds AsTable(Of Kind)=con.GetTable(Of Kind) DimkindResult AsIQueryable(Of Kind)=FromxIn kinds Order Byx.KindCd Selectx DimkindList=kindResult.ToList() ' 猫一覧取得 DimtblCat AsTable(Of Cat)=con.GetTable(Of Cat) Dimresult AsIQueryable(Of Cat) If(searchKind="")Then ' 種別が選択されていなければ名前のみ前方一致指定 result=FromxIn tblCat Wherex.Name.StartsWith(searchName) Order Byx.No Selectx Else ' 種別が選択されていれば名前+種別で検索 result=FromxIn tblCat Wherex.Name.StartsWith(searchName)Andx.KindCd=searchKind Order Byx.No Selectx EndIf ' データグリッドビューに設定 'dgvCat.DataSource = result.ToList() Dimlist AsList(Of Cat)=result.ToList() DimiAsInteger=0 dgvCat.Rows.Clear() Fori=0To list.Count()-1 Dimcat=list(i) ' 行追加 dgvCat.Rows.Add() ' No(プライマリなので編集不可) Dimno=NewDataGridViewTextBoxCell() no.Value=cat.No dgvCat(0,i)=no dgvCat(0,i).ReadOnly=True ' 名前 Dimname=NewDataGridViewTextBoxCell() name.Value=cat.Name dgvCat(1,i)=name ' 性別 Dimsex=NewDataGridViewComboBoxCell() sex.Items.AddRange({"♂","♀"}) sex.DisplayStyle=DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(2,i)=sex dgvCat(2,i).Value=cat.Sex ' 年齢 Dimage=NewDataGridViewTextBoxCell() age.Value=cat.Age dgvCat(3,i)=age ' 種別 Dimkind=NewDataGridViewComboBoxCell() kind.DataSource=kindList kind.DisplayMember="KindName" kind.ValueMember="KindCd" kind.DisplayStyle=DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(4,i)=kind dgvCat(4,i).Value=cat.KindCd ' 好物 Dimfavorite=NewDataGridViewTextBoxCell() favorite.Value=cat.Favorite dgvCat(5,i)=favorite Next EndUsing ' データベースクローズ conn.Close() EndUsing EndSub |
更新処理
データグリッドビューに表示されているデータを全て更新するように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubbtnUpdate_Click(sender AsObject,eAsEventArgs)HandlesbtnUpdate.Click Using conn AsNewSQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ更新 Using con AsNewDataContext(conn) ' 対象のテーブルオブジェクトを取得 DimTable=con.GetTable(Of Cat) ' 選択されているデータを取得 Fori=0To dgvCat.Rows.Count-1 ' テーブルから対象のデータを取得 Dimno AsInteger=dgvCat(0,i).Value Dimtarget AsCat=Table.Single(Function(xAsCat)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 EndUsing conn.Close() EndUsing ' データ再検索 search() MessageBox.Show("データを更新しました。") EndSub |
コンボボックスの制御
以前の記事でもやりましたが、
コンボボックスがワンクリックで開くように仕込みを入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ''' <summary> ''' データグリッドビューセルクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubdgvCat_CellClick(sender AsObject,eAsDataGridViewCellEventArgs)HandlesdgvCat.CellClick Dimdgv AsDataGridView=CType(sender,DataGridView) gridComboHandle(dgv,e) EndSub ''' <summary> ''' データグリッドビューのコンボボックス制御 ''' </summary> ''' <param name="dgv"></param> ''' <param name="e"></param> PrivateSubgridComboHandle(dgv AsDataGridView,eAsDataGridViewCellEventArgs) ' 対象の列だった場合 If dgv.Columns(e.ColumnIndex).Name="ColSex"Or dgv.Columns(e.ColumnIndex).Name="ColKind"Then SendKeys.SendWait("{F4}") EndIf EndSub |
起動してみる
データ検索後の画面。
無事にデータが表示され、データグリッドビューにコンボボックスも表示されています。
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を自身のテーブル名にしてみたのですがエラーがでてしまいます。なにか考えられる対応ありますでしょうか?