C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DataGridViewのバインド元DataTable取得


(過去ログ 101 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■60556 / inTopicNo.1)  DataGridViewのバインド元DataTable取得
  
□投稿者/ きゃむ (1回)-(2011/07/08(Fri) 12:54:23)

分類:[.NET 全般] 

環境:Microsoft Visual C# 2008

DataGridViewを継承したコントロールにて、
自身にバインドされているDataTableを取得する方法で行き詰っています。

多くの場合、開発者は特定のDataGridView.DataSourceに何が設定されているか知っていますので、
そこからバインドされているDataTableを取得するのは容易だと思いますが、
今回のようにDataGridViewを継承したコントロールを作成する場合、
DataGridView.DataSourceからどう辿ればDataTableに行き着くのか特定できません。

バインド方法が特定されていない場合に対応した、DataTableの取得方法というのはあるのでしょうか。

少なくても以下のような場合に対応できればと思います。
・直接DataTableが設定されている
・DataTableのBindingSourceを介して設定されている
・リレーションが設定されたBindingSourceを介して設定されている
・DataGridView.DataSourceに配列やリストなど、DataTable以外が設定されている場合の判定もできるように

やはり細かく場合分けをしなければならないのでしょうか。
BindingSourceが複数絡んだりするととてもやっかいです。

実際に、取得したいDataTableがDataGridViewに表示されているわけなので、
簡単に取得する方法があるような気もするのですが、分かりません。。

もし初歩的な質問だったなら申し訳ありませんが、どうかご教授下さい。
引用返信 編集キー/
■60559 / inTopicNo.2)  Re[1]: DataGridViewのバインド元DataTable取得
□投稿者/ 魔界の仮面弁士 (2240回)-(2011/07/08(Fri) 14:30:20)
No60556 (きゃむ さん) に返信
> 今回のようにDataGridViewを継承したコントロールを作成する場合、
> DataGridView.DataSourceからどう辿ればDataTableに行き着くのか特定できません。
DataSource にバインドされるのは、DataSet / DataTable / DataView / BindingSource 等々、
いろいろなオブジェクトがあり得ます。まずは、DataSource プロパティから得たオブジェクトの
データ型を object.GetType プロパティなどから調べてみましょう。


> バインド方法が特定されていない場合に対応した、DataTableの取得方法というのはあるのでしょうか。
DataSource プロパティから辿る方法の他、DataGridView の行オブジェクトから
DataBoundItem プロパティ経由で DataRowView オブジェクトを得る手法もあります。

DataRowView のインスタンスさえ得られれば、その Row プロパティから
親となる DataRow インスタンスを得られますし、さらにそこから
Table プロパティで DataTable インスタンスを得ることもできます。


 DataRowView rowView = dataGridView1.Rows[0].DataBoundItem as DataRowView;
 if (rowView != null)
 {
     DataRow row = rowView.Row;
     DataTable tbl = row.Table;
     if (tbl != null)
     {
         DataSet ds = tbl.DataSet;
     }
 }

引用返信 編集キー/
■60562 / inTopicNo.3)  Re[2]: DataGridViewのバインド元DataTable取得
□投稿者/ きゃむ (2回)-(2011/07/08(Fri) 16:03:27)
No60559 (魔界の仮面弁士 さん) に返信
> DataRowView のインスタンスさえ得られれば、その Row プロパティから
> 親となる DataRow インスタンスを得られますし、さらにそこから
> Table プロパティで DataTable インスタンスを得ることもできます。
> 
> 
>  DataRowView rowView = dataGridView1.Rows[0].DataBoundItem as DataRowView;
>  if (rowView != null)
>  {
>      DataRow row = rowView.Row;
>      DataTable tbl = row.Table;
>      if (tbl != null)
>      {
>          DataSet ds = tbl.DataSet;
>      }
>  }

魔界の仮面弁士様、ありがとうございます! バッチリ出来ました!!^^
特にリレーションが設定されたBindingSourceの場合が面倒で困ったいたのですが、
たったこれだけでパターン毎に考えることなく実現できてしまうとは。。。目からウロコです。
大変助かりました。どうもありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -