DataGridViewの値取得について

タグの編集
投稿者 大池  (社会人) 投稿日時 2010/1/13 23:02:41
いつもお世話になるばかりでありがとうございます。恐縮です。
XPでVB2008 ExpressEditionを使っています。
DataGridViewの値を取得するためにつぎのようなテストをしましたが、For Eachのところで
「型 'DataTable1DataTable' のオブジェクトを型 'System.Windows.Forms.BindingSource' にキャストできません。」 
For i のところで
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
のエラーがでます。
実は昨年6月30日に同じような質問をさせていただき、
その時のご指導でFor Eachはうまくいったつもりだったのですが、
お恥ずかしい限りです。厚かましくも再度ご指導を乞うしだいです。
よろしくお願いいたします。

        '(1): データ設定
Dim dt As DataSet1.DataTable1DataTable = DataSet1.DataTable1
dt.AddDataTable1Row("001", "勝", "カツ", "1823", "幕府")
dt.AddDataTable1Row("002", "岩倉", "イワクラ", "1825", "公家")
dt.AddDataTable1Row("003", "西郷", "サイゴウ", "1828", "薩摩")
dt.AddDataTable1Row("004", "大久保", "オオクボ", "1830", "薩摩")
dt.AddDataTable1Row("005", "木戸", "キド", "1833", "長州")
'
'(2): データ表示
'DataGridView1.DataSource は DataTable1BindingSource
'
DataGridView1.DataSource = dt
' (3) : DataGridViewの値取得
Dim msg As String = "For Each:"
For Each dr As DataSet1.DataTable1Row In DirectCast(DirectCast(DataGridView1.DataSource, BindingSource).DataSource, DataSet1).DataTable1
   msg += dr.id + "," & dr.名前 + "," & dr.フリガナ + "," & dr.生誕年 + vbCrLf
Next
TextBox3.Text = msg
        

' (4) : DataGridViewの値取得
Dim msg = "For i :"
For i As Integer = 0 To DataGridView1.RowCount - 1
    Dim dr As DataSet1.DataTable1Row = DirectCast(DirectCast(DataGridView1.Rows(i).DataBoundItem, DataRowView).Row, DataSet1.DataTable1Row)
    msg += dr.id & "," & dr.名前 & "," + dr.フリガナ + "," + dr.生誕年 + vbCrLf
Next
TextBox2.Text = msg
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/1/14 02:11:49
まず、
・DataGridView に表示されている内容を列挙したい。
・DataSource に割り当てられている内容を列挙したい。
のいずれであるのかを明らかにしてください。


DataGridView を主体にするのであれば、
 For Each row As DataGridViewRow In DataGridView1.Rows
とすれば OK です。
さらにここから、row.DataBoundItem で DataRowView を取り出し、
さらにその .Row プロパティで、元の DataRow を取り出す事もできます。
http://msdn.microsoft.com/ja-jp/library/4wszzzc7.aspx


一方、DataSource を主体にするのであれば、
> DirectCast(DataGridView1.DataSource, BindingSource)
とするのではなく、DataTable1BindingSource をそのまま使いましょう。

あるいは、そこに割り当てられている DataSet1.DataTable1 を
For Each で列挙する形でも良いでしょう。

また、Filter がセットされている場合には、DataSet1.DataTable1.DefaultView から
DataView オブジェクトを取得し、それを For Each するという手もあります。
投稿者 大池  (社会人) 投稿日時 2010/1/14 06:25:11
魔界の仮面弁士 さま

早速のご指導ありがとうございます。

目的はDataGridViewに表示している内容を取得することです。
このとき Rows(i).Cells(j).Value ではなく、DataSetのDataTableで設定した
見出し項目(これがDataBoundItemでしょうか?)で Rows(i).名前 、 Rows(i).フリガナ で指定し、
これをFor Each、 For i=・・・の両方で記述したく思っています。

未熟のためご指導の内容をすぐに理解できませんが頑張ります。
ありがとうございます。
今後ともよろしくお願いいたします。