DOBON.NET DOBON.NETプログラミング掲示板過去ログ

datatableを使ってデータグリッドビューの値取得

環境/言語:[環境/言語:[Windows 7, .NET2010 C#]]
分類:[.NET]

c#のdatatableを使ってデータグリッドビューの値取得したいのですが、
たとえば、カラム名に[氏名]があったとしまして、このカラム名のデータだけ
メッセージボックスに表示したい場合どのようにコードを書けばよいのでしょうか?
下記のコードですと、DataTable dtTable = (Datatable)this.addressDataGridView.DataSource;のところで、
型'System.Windows.Forms.BindingSource'のオブジェクトを型'System.Data.DataTable'にキャストできません。。
とエラーが出てしまい調べてはみましたが解らず悩んでいるところです。
解る方がいらっしゃいましたらアドバイス是非ともお願いします!
DataTable dtTable = (Datatable)this.addressDataGridView.DataSource;
DataRow[] dr = dtTable.Select("氏名");
for (int i = 0; i < dr.Length; i++)
{
dr[0][i].Tostring();
MessageBox.Show( dr[i]["氏名"].ToString();
}
2012/04/12(Thu) 14:23:48 編集(投稿者)

■No30290に返信(しぃーちゃん☆さんの記事)
> c#のdatatableを使ってデータグリッドビューの値取得したいのですが、
DataTable ですね。大文字小文字に注意。


> 下記のコードですと、DataTable dtTable = (Datatable)this.addressDataGridView.DataSource;のところで、
> 型'System.Windows.Forms.BindingSource'のオブジェクトを型'System.Data.DataTable'にキャストできません。。
「BindingSource のオブジェクト」と言われているのですから、
(DataTable) ではなく、(BindingSource) にキャストせねばなりません。

デザイナから割り当てた場合、DataSource に設定されるオブジェクトは、
DataTable そのものではなく、BindingSource になっている可能性があります。

今回の場合、DataTable が
 this.dataGridView1.DataSource = dataTable1;
と割り当てられているのではなく、
 this.bindingSource1.DataSource = dataTable1;
 this.dataGridView1.DataSource = this.bindingSource1;
のように、多重にバインドされているのでしょう。

(DataTable→BindingSource→BindingSource→DataGridView のように
 複数の BindingSource で中継されている場合もありますし、あるいは、
 DataTableではなく、DataSetやDataView がバインドされる場合もあります)


> たとえば、カラム名に[氏名]があったとしまして、このカラム名のデータだけ
> メッセージボックスに表示したい場合どのようにコードを書けばよいのでしょうか?
そもそも、DataGridView.DataSource から DataTable を後から取り出そうとせず、
DataSource に割り当てている DataTable 変数を、直接操作した方が良いでしょう。

そうすれば、BindingSource 経由でバインドされていようと、
直接 DataSource に割り当てられていようと、同じ手順で処理できます。


もし、DataGridView から値を取得したいのであれば、
 object data = dataGridView1["氏名", 行番号].Value
のように書けます。(バインド列であっても、非バインド列で無くとも OK)


あるいは、DataGridViewRow の DataBoundItem プロパティ経由で
 var rowView = (DataRowView)DataGridView1.Rows[行番号].DataBoundItem;
 if( rowView != null )
 {
  MessageBox.Show( rowView["氏名"].ToString() );
  DataRow row = rowView.Row;
  MessageBox.Show( (string)row["氏名"] );
 }
などと書くこともできます。
DataBoundItem を使った場合は、BindingSource でも DataTable でも OK ですし、
DataGridView に表示させていない列(DataColumn)にもアクセスできます。
魔界の仮面弁士さん☆

早速のアドバイスありがとうございます。
DataTableでのデータへのアクセスが私の場合は弱いところで、
悪戦苦闘しています。。
this.bindingSource1.DataSource = dataTable1;
this.dataGridView1.DataSource = this.bindingSource1;
のように、多重にバインドされている場合ではDataTableを使ってデータを表示させてあげることは難しいのでしょうか?(ちょっと無理行ってしまいますが・)

また、DataTable 変数を、直接操作するには下記のコードをどのように修正すれば良いのでしょうか?

DataTable dtTable = (DataTable)this.addressDataGridView.DataSource;
DataRow[] dr = dtTable.Select("氏名");
for (int i = 0; i < dr.Length; i++)
{
dr[0][i].Tostring();
MessageBox.Show( dr[i]["氏名"].ToString();
}
■No30295に返信(しぃーちゃん☆さんの記事)
> 多重にバインドされている場合ではDataTableを使ってデータを表示させてあげることは難しいのでしょうか?
既に回答したように、手順が違うだけで取得は問題なくできますよ。


> DataTable dtTable = (DataTable)this.addressDataGridView.DataSource;
そもそも、addressDataGridView にデータが表示されているという事は、
DataGridView (あるいは BindingSource) にデータを渡している箇所が
あるという事ですよね。

その場合、基本的には、DataSet/DataTable にデータを格納してから
渡すでしょうから、どこかに DataSet/DataTable 型の変数が
作られているはずで、それを操作すれば良いという事です。

(あるいはフォームに BindingSource を貼ってあるのなら、
 そこから操作することもできるでしょうけれどね)


そしてもし、そうした元データの DataTable 変数に直接アクセスできない
状態なのだとしても、先述のサンプルのように、DataGridViewRow 経由で
DataRow や DataTable にアクセスできますので、わざわざ
DataSource から辿る必要は無いということです。
魔界の仮面弁士さん☆


返事おくれてしまいました。。
アドバイス通りDataSet/DataTable 型の変数が
作られていましたので、それを操作してみたところ出来ました!

親身になってくださってありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板