投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/1/23 21:21:52
さて、今度は DataGridView 側の話。

まず、DataGridView にデータを表示する場合、大きく分けて 3 種類のパターンがあります。
http://msdn.microsoft.com/ja-jp/library/cd28yf6d.aspx

(1) バインドモード(データバインド)
 データのかたまりを .DataSource に渡して、それを表示させる方法です。
 DataSet や DataTable などの表示に利用されます。
 扱いやすい上にもパフォーマンスも良いため、よく利用される方法です。

(2) 非バインド モード(アンバウンド)
 .DataSource を使わず、個々のセルに対してデータを割り当てていく手法です。
 .RowCount 等で行数を確保し、後から「DataGridView1(1,2).Value = 123」などと
 記述したり、あるいは .Rows.Add で行単位にデータを追加する事ができます。
 比較的少量のデータを表示する際に利用されます。

(3) 仮想モード(Virtual)
 描画すべきデータをイベントで渡す手法です。大量のデータがある場合に利用されますが、
 プログラムが複雑化するため、通常の用途で利用される事は稀です。
---

今回は、データを保存するために、DataTable の WriteXml メソッドを使おうと
しているのですから、適切なのは (1) の手法です。先に示したサンプルは、その一例です。


しかし grid さんの元のコードは、データの表示に (1) ではなく、(2) の手法を用いています。
この場合、DataSource は使っていない(空っぽ)の状態ですから、
dTbl = DirectCast(auctionlist.DataSource, DataTable)
と書いても、dTbl は空っぽのままというわけです。


もしも現状のように (2) の手法で DataGridView を使っていきたいのであれば、保存処理を
 (1) XML 保存用に、DataTable の変数を作成する。
 (2) DataGridView の内容を、作成した DataTable にコピーしていく。
 (3) DataTable を WriteXml メソッドで保存する。
という流れにする必要があります。


'DataTable の変数を作成する 
Dim dTbl As DataTable
dTbl = New DataTable("商品リスト")

'列定義を生成する 
dTbl.Columns.Add("管理番号"GetType(Byte))
dTbl.Columns.Add("タイトル")
dTbl.Columns.Add("商品説明")

'DataGridView の内容を、DataTable にコピーしていく 
For Each row As DataGridViewRow In DataGridView1.Rows
    If Not row.IsNewRow Then
        Dim d1 As Byte = row.Cells(0).Value
        Dim d2 As String = row.Cells(1).Value
        Dim d3 As String = row.Cells(2).Value
        dTbl.Rows.Add(d1, d2, d3)
    End If
Next

'DataTable を WriteXml メソッドで保存する 
dTbl.ReadXml("C:\temp\SampleData.xml")