DataGridViewにDataTableを関連付ける (C#)

変数とDataGridViewコントロールの表示を関連付ける手順を紹介します。

関連付けることにより、変数の値を更新すると、自動的にDataGridViewの表示が更新され、
逆に、DataGridView上からデータを書き換えると変数の値が更新されます。



2012/12/05 追記 slnファイル一式をgithubに公開しました。
https://github.com/loftkun/DataSourceTest
Zipボタンをクリックでファイル一式をダウンロードできます。

プロジェクトにデータセットを追加する


適当にWindowsフォームアプリケーションを新規作成し、フォームにDataGridViewコントロールを貼り付けます。
DataGridViewのプロパティにDataSourceという項目がありますが、
まだここに指定するテーブルがありませんのでプロジェクトに追加します。

ソリューションエクスプローラ上でプロジェクト名を右クリック→追加→新しい項目→データ→データセットを選択し、
例として名前を、DataSetSample.xsdとしておきます。
データセットとはデータテーブルの集まりですが、まだ新規で追加したばかりなので空です。

 

 

データセットにデータテーブルを追加する



DataSetSample.xsdの編集画面が開いたと思いますが、空なのでまだ中身は表示されません。
テーブルを追加し、形式を定義する必要があります。

 

 

DataSetSample.xsdの編集画面で右クリック→追加→DataTableと選択すると、DataTable1が追加されます。

 

 

プロパティでNameを変更できます、ここではDataTableSampleとしておきます。

 

 

データテーブルの形式を定義する(型付きデータセットの定義)


DataTableSampleは、まだ空のテーブルです、テーブルの中身を定義します。

右クリック→追加→列と選択すると、DataColumn1が追加されます。
プロパティでNameをDataColumnSample1、DataTypeをSystem.String(default)としておきます。

同様に列を複数追加できます。
ここでは
列名 型名
DataColumnSample1 System.String
DataColumnSample2 System.Int32
DataColumnSample3 System.DateTime
としました。

 

 

DataGridViewとDataTableを関連付ける


作成したDataTableSampleをDataGridViewに関連付けます。

DataGridViewのプロパティのDataSorceの項目を、dataTableSampleBindingSourceとします。
(他のデータソース→プロジェクトデータソース→DataSetSample→DataTableSampleと選択します).
DataGridViewに列が表示されます。

これでDataGridViewと変数DataTableSampleが関連付けられました。

 

 

データの追加


データの追加例です。

namespace DataSourceTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataSetSample.DataTableSample.AddDataTableSampleRow("あいう", 123, DateTime.Now);
            dataSetSample.DataTableSample.AddDataTableSampleRow("ABC",    456, DateTime.Now);
            dataSetSample.DataTableSample.AddDataTableSampleRow("えお",     0, DateTime.Now);
            dataSetSample.DataTableSample.AddDataTableSampleRow("DEF",     -5, DateTime.Now);
            dataSetSample.DataTableSample.AddDataTableSampleRow("かきく",  99, DateTime.Now);
        }


        private void button1_Click(object sender, EventArgs e)
        {
            dataSetSample.DataTableSample.AddDataTableSampleRow("くけこ", 987, DateTime.Now);
        }
    }
}

フォーム起動時、自動的にDataGridViewの表示に反映されています。



button1ハンドラでDataTableに列データを追加しても自動的に表示も更新されます。


データの削除



試しにDataGridView上でデータを削除すると、、、
Countが4になりました、確かにデータ側も削除されています。

 

あとがき


注目点はDataGridViewを操作するコードを全く書いていないことです。
DataSourceに表示したいデータを関連付けておくと、自動的に表示され、
DataGridView側からの変更もデータに反映されます、便利ですね。

12件のコメント

  1. ピンバック:System.Data.SQLiteデータベース基本操作 その2 DataGridViewとの連携 (C#) | 夏研ブログ

  2. 初めてお邪魔しました。
    DataGridViewとDataTableを関連付けるを、興味深く見さて頂いてます。
    当方はVisual Studio 2010 C# Express版なんですが、説明にある通りしてるつもりなんですが、関連付けがどうしても出来ません。
    別のやり方の参考書でもやはり出来ません。少し前の本ですが。Express版だと出来ないのでしょうか?
    お心当たりがあれば教えて欲しいのですが。

  3. ロフトくん

    >鈴木 勇さん
    こんにちは。
    Visual Studio 2010 C# Express版でもできます。
    手順のどこまでできてそうかお知らせ頂くと何かわかるかもしれません。
    slnファイル一式をgithubに公開しました。
    https://github.com/loftkun/DataSourceTest
    Zipのボタンクリックで一式をダウンロードできます。

  4. ロフトさん、早速のお返事ありがとうございます。

    このページの内容ですが
    DataGridViewとDataTableを関連付ける
    と、あるところで、関連が付けられればカラムの名称がFormを見たときに出るのでしょうけど、それが出ません。
    勿論デバッグしても何も表示になりません。
    それまでの段階でどこか間違ってるのでしょうか?

     大分前にC#の製品版を買ってましたので、それをインストールしてやって見たら、出来たのですが、古いので使いづらいのです。それとOSがWIndows7 64bitですので、Virtual PCモードでないとインストールできないなど、使いづらいのです。

  5. お陰様で分かりました。
    dataSetとは連結してましたが、Tableと連結してませんでした。DataMemberプロパティでTable1を指定したら、連結できました。

  6. ロフトくん

    >鈴木 勇さん
    こんにちは。
    ひとまず解決ですね、よかったです。
    (DataMemberプロパティは特にいじらずできているつもりなのですが、
    もしブログ記事と何か手順が違う点がありましたらコメント頂ければ幸いです。。)

  7. お世話になっております。名前をハンドルへ変更します。(^0^)
     関連なので続けさせて貰います。新たな問題が発生です。
     Accessのデータベースでのことです。接続等は出来てますので、それのことは問題ないように思います。
     例題としての話しです。データベースは既にあります。例として、農家の所有している農地を考えます。普通は、1人の個人が複数の農地を持ってます。1人の農家のコードを入力すれば、その人の農地を全部表示する、それを考えると、テーブルは2個必要ですね。農家のテーブルと農地のテーブルです。リレーションは農家のコードと言うことになると思います。
     上のC#のDataGridを使って出来ないか、やって見てます。TalbleAdapterは2個で来てます。
     多分ですが、農地のTalbleAdapterでDataMemberをリレーションを選べば、良いのだろうと思ったのですが、(説明を読んだ結果です)でもリレーションが表示なりません。
     DataMemberで農地のテーブルを選べますが、それだと単に二つ表示にあるだけですね。リレーションを選ぶ方法が分かりません。
     もし分かったら教えて欲しいのですが。その前に、説明が分かりますか?なかなか問題を説明するのも難しいです。問題が分からなければ、答えようも無いと思います。
     お手数をお掛けしますが、どうかよろしくお願いします。

  8. ロフトくん

    >isampmさん
    こんにちは。
    リレーションを知らないのでお力になれない気がしております。。

    軽く調べてみると、テーブル間の関係を表すものなのですね。。
    http://jehupc.exblog.jp/12753273/
     VisualStudioのデータセットデザイナでリレーションを設定しておいて
     親や子の情報を呼び出す方法が紹介されてました。

  9. ロフトくん

    素人考えですが、私がいだいたイメージです。

    農家テーブル
     コード 名前   住所
     ———————————-
     0001  大根太郎 ○市
     0002  人参太郎 △市

    農地テーブル
     コード 住所
     ———————————-
     0001  ○市□町
     0002  ○市■町
     0003  ●市◇町

    所有情報テーブル
     農家コード 農地コード
     ———————————-
     0001    0001
     0001    0002
     0002    0003
     
    農家テーブル、農地テーブル、所有テーブルを用意する。

    1. 所有情報を抽出
     農家のコードが入力されたら、所有情報テーブルに問い合わせて、
     所有情報レコードを取り出す。(複数レコードがHITする)。

    2. 農地情報を問い合わせ
     1.でHITした所有情報レコード群のレコードひとつづつに対して、
     農地コードを用いて農地テーブルから農地情報を取り出す。(所有情報テーブルと農地テーブルは農地コードでリレーション?)

    3. 農家情報を問い合わせ
     必要に応じて、農家のコードを用いて農家情報を取り出す。(所有情報テーブルと農家テーブルは農家コードでリレーション?)

    4. 結果表示
     2.の結果をDataGridViewに表示。
     必要に応じて3.の結果もDataGridView等に表示。

    農家情報(3.の結果表示)
     コード 名前   住所
     ———————————-
     0001  大根太郎 ○市

    所有している農地情報(2.の結果表示)
     農地コード 農地住所
     ———————-
     0001    ○市□町
     0002    ○市■町

  10. ロフトくん

    農地テーブルに所有者コード(=農家コード)があると、
    テーブルは2つになるのですね。

    農家テーブル
     コード 名前   住所
     ———————————-———————————-—————
     0001  大根太郎 ○市
     0002  人参太郎 △市

    農地テーブル(所有者コードは農家コード)
     コード 住所   所有者コード
     ———————————-———————————-—————
     0001  ○市□町 0001
     0002  ○市■町 0001
     0003  ●市◇町 0002

    農家テーブル、農地テーブルを用意する。

    1. 農地レコード群を抽出
     農家のコードが入力されたら、農地テーブルに問い合わせて、
     農地レコードを取り出す。(複数レコードがHITする)。

    2. 農家情報を問い合わせ
     必要に応じて、農家のコードを用いて農家テーブルに問い合わせて
     農家情報を取り出す。

    3. 結果表示
     1.の結果をDataGridViewに表示。
     必要に応じて2.の結果もDataGridView等に表示。

      農家情報(2.の結果表示)
       コード 名前   住所
       ———————————-———————————-—————
       0001  大根太郎 ○市
      
      所有している農地情報(1.の結果表示。ただし所有者コードの表示は不要。)
       コード 住所   所有者コード
       ———————————-———————————-—————
       0001  ○市□町 0001
       0002  ○市■町 0001

  11. 色々と考えてくれて有り難う御座います。ほぼ一日中ネットで該当するサイトを探しておりました。そしたらありました。VB用のコードなんですが、手順は全く同じで、しかもコード無し。必要ない。例題とぴったりの内容です。
    http://code.msdn.microsoft.com/10-ADONET-Visual-Studio-f2b6fb69/
     疑問は次から次と出てくるのですが、取り敢えずはこれ良しとしておきます。どうも有り難う御座いました。

  12. ロフトくん

    >isampmさん
    こんにちは。
    良い情報をありがとうございます、これは試してみたい。。。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です