none
Accessの更新されたデータをListViewに表示する RRS feed

  • 質問

  • こんにちは、

     

    日本語版の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
    2012年1月5日 4:29

回答

  • 返答ありがとうございます。

     

    問題は最初の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
    2012年1月5日 6:05

すべての返信

  • OleDbDataAdapterのFillメソッドはデータテーブルへ追加のみ行います。したがって、2回目以降は一度データテーブルの全レコードをクリアしてからFillする必要があります。Employ1のClearメソッドを実行してからFillしてみて下さい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2012年1月5日 5:53
    モデレータ
  • 返答ありがとうございます。

     

    問題は最初の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
    2012年1月5日 6:05
  • 結果的にはそれでも良いですが、論理的にはわかりにくいコードだと思います。データテーブルをクリアする理由は次にFillするためですから、Fillする直前でクリアした方がコードがわかりやすくなると思います。
    ListViewはデータバインドをサポートしていないので、ListViewで表示されている内容とデータテーブルの内容が異なってもかまいませんが、DataGridViewなどでデータバインドを行う場合、現在のOnion Ringさんのやり方ではうまくいきません。DataGridViewなどのデータバインドをサポートしたコントロールを今後使う上でも、表示されている内容とデータテーブルの内容が一致するように考えてコーディングされることをお勧めします。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2012年1月5日 7:01
    モデレータ
  • 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クリック時に呼んであげれば判り易くないですかね・・・

    2012年1月5日 7:19