トップ回答者
Accessの更新されたデータをListViewに表示する

質問
-
こんにちは、
日本語版のVisual Studioのフォーラムでは初めて投稿します。よろしくお願いします。Windows用のソフトの開発に携わって大体2ヶ月半ぐらいです。
今テストしているのが、アクセスのデータベース・ファイル(accdb)を読み込み、DataGridViewerを使うのではなく、ListViewに表示することです。と言っても、データをListViewに表示するのは問題ありません。Form1_Loadのeventのコードは以下の通りです。
Private MyConnection As OleDbConnection Private MyAdapter As OleDb.OleDbDataAdapter Private DS0 As New DataSet MyConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=...") Dim i As Integer MyConnection.Open() MyAdapter = New OleDb.OleDbDataAdapter("Select * From Employ1", MyConnection) MyAdapter.Fill(DS0, "Employ1") For i = 0 To DS0.Tables("Employ1").Rows.Count - 1 ListView1.Items.Add(DS0.Tables("Employ1").Rows(i).Item(0)) ListView1.Items(i).SubItems.Add(DS0.Tables("Employ1").Rows(i).Item(2)) ListView1.Items(i).SubItems.Add(DS0.Tables("Employ1").Rows(i).Item(1)) ListView1.Items(i).SubItems.Add(DS0.Tables("Employ1").Rows(i).Item(3)) Next i
それに引き継ぎ、新しいrecordの挿入や選択されたrecordの削除・訂正も問題なくできます。今困っているのが、(挿入・削除・訂正後の)更新された全データを同じListViewに表示することです。例えば、以下のようにボタンを使ってデータを一度消去してからまた表示しようとすると、更新されたデータが2度繰り返されていまいます。Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListView1.Items.Clear()
MyAdapter.Fill(DS0, "Employ1")
For = 0 To DS0.Tables("Employ1").Rows.Count - 1
ListView1.Items.Add(DS0.Tables("Employ1").Rows().Item(0))
ListView1.Items().SubItems.Add(DS0.Tables("Employ1").Rows().Item(2))
ListView1.Items().SubItems.Add(DS0.Tables("Employ1").Rows().Item(1))
ListView1.Items().SubItems.Add(DS0.Tables("Employ1").Rows().Item(3))
Next
End Subどうやったら更新後のデータをListViewに1度のみ表示することができるでしょうか?
以上よろしくお願いします。
タマネギの輪切り
Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64- 編集済み Onion Ring 2012年1月5日 5:09
回答
-
返答ありがとうございます。
問題は最初のForm1_Loadでデータを読む時に問題があったようです。以下のものを最後に挿入したら二度データが繰り返されなくなりました。
DS0.Clear()
再びデータ読むコードはそのままです。
Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64- 回答としてマーク Onion Ring 2012年1月5日 6:05
すべての返信
-
返答ありがとうございます。
問題は最初のForm1_Loadでデータを読む時に問題があったようです。以下のものを最後に挿入したら二度データが繰り返されなくなりました。
DS0.Clear()
再びデータ読むコードはそのままです。
Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64- 回答としてマーク Onion Ring 2012年1月5日 6:05
-
結果的にはそれでも良いですが、論理的にはわかりにくいコードだと思います。データテーブルをクリアする理由は次にFillするためですから、Fillする直前でクリアした方がコードがわかりやすくなると思います。
ListViewはデータバインドをサポートしていないので、ListViewで表示されている内容とデータテーブルの内容が異なってもかまいませんが、DataGridViewなどでデータバインドを行う場合、現在のOnion Ringさんのやり方ではうまくいきません。DataGridViewなどのデータバインドをサポートしたコントロールを今後使う上でも、表示されている内容とデータテーブルの内容が一致するように考えてコーディングされることをお勧めします。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
Private Sub RefreshList() Dim DS0 As New DataSet MyAdapter.Fill(DS0, "Employ1") ListView1.Items.Clear() For i = 0 To DS0.Tables("Employ1").Rows.Count - 1 ListView1.Items.Add(DS0.Tables("Employ1").Rows(i).Item(0)) ListView1.Items(i).SubItems.Add(DS0.Tables("Employ1").Rows(i).Item(2)) ListView1.Items(i).SubItems.Add(DS0.Tables("Employ1").Rows(i).Item(1)) ListView1.Items(i).SubItems.Add(DS0.Tables("Employ1").Rows(i).Item(3)) Next i End Sub
更新側の仕様が見えないので明言は出来ませんが、個人的にはデータアクセス用の変数はメンバ変数である必要が無い様に感じます。DBコネクションを張りっぱなしにする必要はあるのでしょうか?
個人的には、少なくともDataSetはメンバ変数にしなくするべきだと思います。
上記の様なメソッドを作成し、Load時及びButtonクリック時に呼んであげれば判り易くないですかね・・・