none
DataGridView A で選択した行の情報を DataGridView B へ渡すにはどうしたらよいのでしょう? RRS feed

  • 質問

  • DataGridView を2つ用意し (DataGridView A, DataGridView B)、一方 (A) で
    選択した行の情報を他方 (B) に渡したいのですが、どういう方法があるのでしょ
    うか?

     

    A の行が B にごっそりコピーされるイメージです。

     

    ここを読め、という情報でも構いません。

     

    検索しようにも、キーワードが分からないので手が止まってしまいます。

    2007年12月6日 2:56

回答

  • ぱっと思いついた手段だと
    1. DataGridView A と DataGridView B にそれぞれDataTableをバインドする。
    2. DataGridView A で選択されたもののキー情報を使って DataGridView A の
       データソース(この場合は1.で指定したDataTable)からDataRowの形でデータ取得する。
    3. 2.で得たデータを DataGridView B のデータソースのDataTableに挿入する。
       (DataTableのスキーマが違えば当然加工が必要)
    ってなります(いろいろ端折ってます)。

     

    私は一度取得したデータを常にDataTableに入れているので上記のやり方が一番に思いついたのですが
    用件によってはいちいちそんなことしないでもいいのかもしれませんし、
    DataGridViewに対して何をバインドするのかによっても変わってくると思います。

     

    ご質問でもかかれてますが、いろんな方法があると思いますし、
    全部を説明することは多分誰もしませんので、せめてやり方と手順を決めた上で、
    どこがわからないかはっきりさせてご質問されないと有効な回答をいただくのは
    なかなか難しいと思います。

    2007年12月10日 4:21
  •  custar さんからの引用

    - DataGridView 上に表示させているデータを加工したり、取り出したりするに
      は、どのオブジェクトを操作すればよいのか?

     

    データテーブルのデータを表示しているのであれば、プログラムからDataGridViewのセルの値をいじるケースはあまりありません。一般に、データの元であるデータテーブルのデータをいじり、それをDataGridViewに反映させます。ただ、例外ももちろんあります。


     custar さんからの引用

    - 図中の DataGridView は単なる表示を受け持っているだけのようだけど、
      DataSet はデータベースの情報をメモリ上に展開したものと聞いているので、
      DataSet を操作すればよいのか?

    - でも、DataSet は DataTable というデータベースのテーブルに相当するもの
      があるというから、テーブルを操作すべきなのか?

     

    そうです。

     

     custar さんからの引用

    - でも、残された BindingSource って何に使うのだろうか?

    - DataSource というものもあるそうだが、BindingSource にも DataGridView
      にもあるようだ。何のためにあり、どう使い分けるのかな?

     

    DataSourceにBindingSourceを指定します。DataSourceという入り口のコンセントに、BindingSourceというデータを供給するプラグを差込ます。

     

     custar さんからの引用

    BindingSource には以下の目的があるそうだ。

     

    (a) 通貨管理、変更通知、およびその他のサービスを Windows フォーム コン
        トロールとデータ ソース間に提供することにより、フォーム上のコントロー
        ルからデータへのバインディングを簡素化する

     

    [DataGridView]---[BindingSource]---[DataSet]

     

    という繋がりを作り、BindingSource は両端の中継を行うのかな? 何のために?
    この構造が良かったのかな?

     

    書かれている通りです。BindingSourceは.NET Framework2.0になって追加されたものです。それまではBindingContextというものでデータバインディングが直接管理されていましたが、使いにくい、わかりにくいということで、BindingSourceが追加されたのだと思います。BindingSourceはCurrencyManagerなどのBindingContextをラップしたものです。詳しくはBindingContextを調べてみて下さい。

     

     custar さんからの引用

    (b) 厳密に型指定されたデータ ソースとして機能する

     

    何を言われているのか、よく分からない。

     

    型指定される、つまり、データソースをクラスでラップしちゃうということです。こうすることにより、インテリセンスが働くようになりますし、文字列でカラム名などを与えなくて済むようなり(プロパティとしてカラムが実装されるので)、コンパイル時にエラーがチェックできるようになります。

     

     custar さんからの引用

    - DataGridView と DataSet を繋げただけだと、データの塊を操作する感じな
      のだが、ある id に該当するたった1つのデータのみを取り出して変数に収め
      たいとき、何に対して、どうすればよいのかな? tableAdapter.FillById()
      のようなものを使うのかな?

     

    DataSetやDataTableはリスト形式のデータを扱うものです。単一行のデータであれば、SqlCommand等を使うのが普通です。

     

     custar さんからの引用

    - 何処かにデータベースから取り込んでいるデータが格納されていると思うの
      だが、それが DataSet, DataTable であるのかな? だとしたら、望ましくは
      どのような手段でそのデータにアクセスすればよいのかな?

     

    その通りです。最後の行の質問の意味がよくわかりませんが、データベースを直接いじる代わりにデータテーブルをいじり、それをデータベースへ書き戻すイメージです。

    2007年12月10日 6:42
    モデレータ

すべての返信

  • どういう形でDataGridViewにデータ表示してるとか、AとBの違いは何、とか
    いろいろ情報が欠けていると思います。

    そのものずばりは検索しても出てこないと思うので、どういう手順でやるか

    分割して一つずつ解決していくといいと思います。

    2007年12月6日 7:23
  • お返事ありがとうございます。

     

    特に指定はありませんが、まずは簡単に DataGridViewTextBoxColumn 型のセル
    をもつ DataGridView A の行を、そのまま Copy (Clone?) して、
    DataGridView B の行として挿入したいと考えています。

     

    例えば、下図のようになります。

     

     

    2007年12月6日 7:49
  • 上の話は横に置いといて、基本的なことが分かっていないので、その点をお分
    かりの方々から教えていただけないでしょうか。

     

    分かっていないのは、DataGridView, BindingSource, DataSet, TableAdapter
    の扱い方です。参考として以下の図を引き合いに出したいと思います。

     

    - 図:Windowsプロジェクトで利用できるデータベース・コントロールの関係
    http://itpro.nikkeibp.co.jp/article/COLUMN/20070320/265659/zu02s.jpg

     

    出典:Part6 .NETで,データベース・プログラムはこう作るTableAdapterクラスがカギを握る:ITpro
    http://itpro.nikkeibp.co.jp/article/COLUMN/20070320/265659/


    私の頭の中で全く整理できていないので、ここに整理して書き出せないのです
    が、浮かんでいる疑問を列挙すると、


    - DataGridView 上に表示させているデータを加工したり、取り出したりするに
      は、どのオブジェクトを操作すればよいのか?

     

    - 図中の DataGridView は単なる表示を受け持っているだけのようだけど、
      DataSet はデータベースの情報をメモリ上に展開したものと聞いているので、
      DataSet を操作すればよいのか?

     

    - でも、DataSet は DataTable というデータベースのテーブルに相当するもの
      があるというから、テーブルを操作すべきなのか?

     

    - でも、残された BindingSource って何に使うのだろうか?

    - DataSource というものもあるそうだが、BindingSource にも DataGridView
      にもあるようだ。何のためにあり、どう使い分けるのかな?

     

    - 下記情報によると

     

    BindingSource クラス (System.Windows.Forms)
    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.bindingsource.aspx

     

    BindingSource には以下の目的があるそうだ。

     

    (a) 通貨管理、変更通知、およびその他のサービスを Windows フォーム コン
        トロールとデータ ソース間に提供することにより、フォーム上のコントロー
        ルからデータへのバインディングを簡素化する

     

    [DataGridView]---[BindingSource]---[DataSet]

     

    という繋がりを作り、BindingSource は両端の中継を行うのかな? 何のために?
    この構造が良かったのかな?

     

    (b) 厳密に型指定されたデータ ソースとして機能する

     

    何を言われているのか、よく分からない。


    - DataGridView と DataSet を繋げただけだと、データの塊を操作する感じな
      のだが、ある id に該当するたった1つのデータのみを取り出して変数に収め
      たいとき、何に対して、どうすればよいのかな? tableAdapter.FillById()
      のようなものを使うのかな?

     

    - 何処かにデータベースから取り込んでいるデータが格納されていると思うの
      だが、それが DataSet, DataTable であるのかな? だとしたら、望ましくは
      どのような手段でそのデータにアクセスすればよいのかな?

     

    ....と、混乱状態です。まとまりのない文で申し訳ありません。

     

    断片的に手も宜しいので、お分かりの方、解説をお願いできませんでしょうか。
    もしくは、参考資料へのポインタでも構いません。

    2007年12月6日 19:12
  • ぱっと思いついた手段だと
    1. DataGridView A と DataGridView B にそれぞれDataTableをバインドする。
    2. DataGridView A で選択されたもののキー情報を使って DataGridView A の
       データソース(この場合は1.で指定したDataTable)からDataRowの形でデータ取得する。
    3. 2.で得たデータを DataGridView B のデータソースのDataTableに挿入する。
       (DataTableのスキーマが違えば当然加工が必要)
    ってなります(いろいろ端折ってます)。

     

    私は一度取得したデータを常にDataTableに入れているので上記のやり方が一番に思いついたのですが
    用件によってはいちいちそんなことしないでもいいのかもしれませんし、
    DataGridViewに対して何をバインドするのかによっても変わってくると思います。

     

    ご質問でもかかれてますが、いろんな方法があると思いますし、
    全部を説明することは多分誰もしませんので、せめてやり方と手順を決めた上で、
    どこがわからないかはっきりさせてご質問されないと有効な回答をいただくのは
    なかなか難しいと思います。

    2007年12月10日 4:21
  •  custar さんからの引用

    - DataGridView 上に表示させているデータを加工したり、取り出したりするに
      は、どのオブジェクトを操作すればよいのか?

     

    データテーブルのデータを表示しているのであれば、プログラムからDataGridViewのセルの値をいじるケースはあまりありません。一般に、データの元であるデータテーブルのデータをいじり、それをDataGridViewに反映させます。ただ、例外ももちろんあります。


     custar さんからの引用

    - 図中の DataGridView は単なる表示を受け持っているだけのようだけど、
      DataSet はデータベースの情報をメモリ上に展開したものと聞いているので、
      DataSet を操作すればよいのか?

    - でも、DataSet は DataTable というデータベースのテーブルに相当するもの
      があるというから、テーブルを操作すべきなのか?

     

    そうです。

     

     custar さんからの引用

    - でも、残された BindingSource って何に使うのだろうか?

    - DataSource というものもあるそうだが、BindingSource にも DataGridView
      にもあるようだ。何のためにあり、どう使い分けるのかな?

     

    DataSourceにBindingSourceを指定します。DataSourceという入り口のコンセントに、BindingSourceというデータを供給するプラグを差込ます。

     

     custar さんからの引用

    BindingSource には以下の目的があるそうだ。

     

    (a) 通貨管理、変更通知、およびその他のサービスを Windows フォーム コン
        トロールとデータ ソース間に提供することにより、フォーム上のコントロー
        ルからデータへのバインディングを簡素化する

     

    [DataGridView]---[BindingSource]---[DataSet]

     

    という繋がりを作り、BindingSource は両端の中継を行うのかな? 何のために?
    この構造が良かったのかな?

     

    書かれている通りです。BindingSourceは.NET Framework2.0になって追加されたものです。それまではBindingContextというものでデータバインディングが直接管理されていましたが、使いにくい、わかりにくいということで、BindingSourceが追加されたのだと思います。BindingSourceはCurrencyManagerなどのBindingContextをラップしたものです。詳しくはBindingContextを調べてみて下さい。

     

     custar さんからの引用

    (b) 厳密に型指定されたデータ ソースとして機能する

     

    何を言われているのか、よく分からない。

     

    型指定される、つまり、データソースをクラスでラップしちゃうということです。こうすることにより、インテリセンスが働くようになりますし、文字列でカラム名などを与えなくて済むようなり(プロパティとしてカラムが実装されるので)、コンパイル時にエラーがチェックできるようになります。

     

     custar さんからの引用

    - DataGridView と DataSet を繋げただけだと、データの塊を操作する感じな
      のだが、ある id に該当するたった1つのデータのみを取り出して変数に収め
      たいとき、何に対して、どうすればよいのかな? tableAdapter.FillById()
      のようなものを使うのかな?

     

    DataSetやDataTableはリスト形式のデータを扱うものです。単一行のデータであれば、SqlCommand等を使うのが普通です。

     

     custar さんからの引用

    - 何処かにデータベースから取り込んでいるデータが格納されていると思うの
      だが、それが DataSet, DataTable であるのかな? だとしたら、望ましくは
      どのような手段でそのデータにアクセスすればよいのかな?

     

    その通りです。最後の行の質問の意味がよくわかりませんが、データベースを直接いじる代わりにデータテーブルをいじり、それをデータベースへ書き戻すイメージです。

    2007年12月10日 6:42
    モデレータ
  • ふぉぉ、mars12 さん、trapemiya さん、お返事ありがとうございます。

     

    余りに回答が面倒そうな質問だったので消そうとしたけど消せなくて、放った
    らかしにしようとした矢先でした。まさか、返事があるとは、ありがたい。

     

    msdn2 とにらめっこでちびちびと学習が進んでいます。

     

    mars12 さんの手法をまさしく今日やっていたところです。

     

    trapemiya さん、とても面倒見の良い方なんですね。
    ここまで逐一応えていただけるとは思ってもいませんでした。

     

    今日までの学習で、DataSet (DataTable) 内の情報は Select() で SQL の構文

    に近い形でデータを取得でき、BindingSource でも Filter で SQL と類似の絞込み
    ができることが分かりました。
    # なーんだ、こんなもんか、という安堵の気持ち。

     

    trapemiya さんが応えられている内容も今では分かります。すっきりです。

     

    .net 初心者の私の感想を述べると、C# 2003, 2005, 2008 などバージョンの違
    いを明確にしないまま、旧来の日本語ドキュメントが残っされているのが混乱
    の元でした。

     

    私は片っ端からドキュメントに目を通してコーディングに取り掛かろうとしま
    すので、頭の中では新旧のドキュメントが混在していました。今は何とか整理
    できつつあります。

     

    あと、コントロール名と実物が結びついていないことが学習速度を遅らせてい
    ます。ToolStripMenuItem, ToolStripDropDownItem などなど、これらがどんな
    コントロールなのかよく分からなかったのです。
    # これらは「コントロール」というのか疑問。コンポーネント?

     

    どれが ToolStripMenuItem でどれが ToolStripDropDownItem など、一つ一つ
    図解している msdn 資料がないものですかね。

    2007年12月10日 17:39