引き続き、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
とりあえず検索します。
追加ボタンをクリックすると空行が追加されます。
追加された行に値を設定します。
更新ボタンをクリック、再検索後の画面が表示されます。
年の瀬となり忙しくなってまいりましたが
なんとか更新していきたいと思います。
次回はどうしようかな。。
ではでは。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント