DataGridView のデータ取得をDataSetのような形でできないでしょうか?

タグの編集
投稿者 大池  (社会人) 投稿日時 2009/7/1 04:57:13
勉強不足でうまく説明ができなくてすみません。トンチンカンの質問でしたらお許しください。
DataSet、DataGridViewの勉強のためにつぎのようなテストをしました。

・DataSet1の列の定義をDataTable1でA,B,C,Dとしました。
・DataGridViewにデータセットを関連付けをしました。

・Dim dt As DataSet1.DataTable1DataTable = DataSet1.DataTable1
  dt.AddDataTable1Row("001", "aa", "bb", "cc")
  ・
  ・
  でデータを作りDataGridView1に表示できました。
・ ここでDataSet1のデータ取得は
   For Each dr As DataSet1.DataTable1Row In DataSet1.DataTable1
       msg =  dr.A & "," & dr.B & "," & dr.C
    Next
  でできました。
・一方、DataGridView1 は DataGridView1.Rows(i).Cells(j).Value
 でできますが、dr.A の方が一義的に取得でき後の扱いも便利なように思います。
・そこでDataGridView1でもこのような形で値の取得ができないものでしょうか?
どなたかお教えください。よろしくお願いいたします。
投稿者 るきお  (社会人) 投稿日時 2009/7/1 05:41:50
こういうことでしょうか?

  
Dim msg As String

For Each dr As DataSet1.DataTable1Row In DirectCast(DataGridView1.DataSource, DataSet1).DataTable1
    msg = dr.A & "," & dr.B & "," & dr.C
    MsgBox(msg)
Next


DataGridViewのDataSourceプロパティを使えば、関連付けられたDataSetやDataTableを取得できるので、DataSetやDataTableのほうが扱いやすいので好きなようにできます。
投稿者 大池  (社会人) 投稿日時 2009/7/1 17:39:50
るきお様
早速のご指導ありがとうございます。
まさに私が知りたかったものそのものです。感激!!!
DirectCast、 DataSource など全く無知でした
勉強したいと思います。

今後ともよろしくお願いいたします。
投稿者 大池  (社会人) 投稿日時 2009/7/2 04:46:18
すみません。
今朝テストをしないでお礼を記載させていただきましたが、テストの結果次のようなエラーがでました。
ご指導のほどよろしくお願いいたします。

For Each dr As DataSet1.DataTable1Row In DirectCast(DataGridView1.DataSource, DataSet1).DataTable1
のところで

型 'System.Windows.Forms.BindingSource' のオブジェクトを
型() 'vb2008Test.DataSet1' にキャストできません。
 関連するヒント 
変換元と変換先の型をチェックして、変換が有効であることを確認します。

というエラーメッセージが出ました。どこをどのようにチェックしたらいいのかとまどっています。
お助けください。
使っているソフトは XP上で無料のダウンロードしましたVB2008です。
よろしくお願いいたします。

投稿者 るきお  (社会人) 投稿日時 2009/7/2 08:20:14
DataGridView1にデータをセットする方法によって方法が変わります。
どのようにDataGridView1にデータをセットしていますか?
こちらでも同じことを試せる手順で示していただけるととてもよいです。

ちょっと長くて申し訳ないのですが、私はだいたいこの方法でデータをセットしています。
http://homepage1.nifty.com/rucio/main/VBdotNet/Database/Database4.htm
(リスト4あたり)

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/7/2 10:44:40
BindingSource を使っているのですね。であれば、
DirectCast(DataGridView1.DataSource, DataSet1).DataTable1
の部分を、
DirectCast(DirectCast(DataGridView1.DataSource, BindingSource).DataSource, DataSet1).DataTable1
とするとどうでしょうか。
(リレーションを貼ってある場合などでは、BindingSource.DataSource を
 さらに別の BindingSource に割り当てている可能性もありますが…)


あるいは、こうかな。
Dim dr As DataSet1.DataTable1Row = DirectCast(DirectCast(DataGridView1.Rows(行番号).DataBoundItem, DataRowView).Row, DataSet1.DataTable1Row)

# 開発環境の無いところから投稿しているので、検証していません。
# 間違っていたらごめんなさい。
投稿者 大池  (社会人) 投稿日時 2009/7/3 01:03:53
るきお様
お手数をおかけします。
>どのようにDataGridView1にデータをセットしていますか?
このあたりがよくわからないのですが、
DataGridView1のプロパティウインドウのDataSourceからDataTable1を選びました。
するとDataTable1BindingSourceと表示されています。これで回答になっていますでしょうか?

お示しのアドレスでVisualBasic中学校のデータベース講座が表れてびっくりしました。
実は私は初級講座からずっと勉強させいただきましたが、データベースに入ったとたんに別世界に入ったようで理解することができず恥ずかしながら挫折したところでした。すみません。

投稿者 大池  (社会人) 投稿日時 2009/7/3 05:10:27
魔界の仮面弁士 さま
お世話になります。

>BindingSource を使っているのですね。であれば、

るきえさんが聞いてこられたのはこのことなんですね。

For Each dr As DataSet1.DataTable1Row In DirectCast(DirectCastDataGridView1.DataSource, BindingSource).DataSource, DataSet1).DataTable1
    msg += dr.A & "," & dr.B & "," & dr.C & "," & dr.D & "," & dr.E & vbCrLf
Next
でばっちりできました。ありがとうございます。感激しています。
また、

>あるいは、こうかな。
 では
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.A & dr.B & dr.C & dr.D & "," & dr.E & vbCrLf
Next
とやりますと Dim ・・・のところで次のエラーがでました。
「New キーワードを使用してインスタンスを作成します。」
こうなるとますます困ってしまうんですが、この構文は是非使いたく思いますのでご教授のほどよろしくお願いいたします。