2008年10月12日日曜日

VC++ 2008 Express でDataGridViewとDataSourceを使ってみる

C#でDataSourceを使ってDataGridViewに表示させるサンプルは、ドキュメントに書かれているようですが、C++については載ってなかったので、勘でコードを書いて見たのですが、それでもちゃんと動いているようなので、簡単なやり方を書いてみます。ただし、この方法が最適なものかはわかりません。とりあえずです…。

まずは、テーブルの定義をどこかでやるのですが、VC++でサポートされているデータベースであれば、接続してテーブル定義を引っ張ることができるようですが、そうでない場合、データデザイナを使って定義したいところですが、VC++でサポートされていないということになってます。
とりあえず、VC# Express Editionであれば、データデザイナでテーブル定義ができるのそれで定義します。そうすると、xsdファイルが生成されるので、これをVC++のプロジェクトに追加します(プロジェクトのディレクトリにコピーして、既存追加したほうがよいかも)。

そうすると、xsdファイルを開くとデータデザイナらしき画面が表示されます。ここでも編集が可能なようです。さらにxsc、xssとヘッダファイルが生成されます。xscとxssはソリューションエクスプローラー上では、エラーを示すアイコンが表示されているのですが、C++のビルドにはこれらは使わなくてもよさそうなので、そのまま放置しておきます。
生成されるヘッダーですが、中身をみる限りちゃんと定義されたテーブルどおりのDataSetやDataTableのコードになっていて、コンパイルもできます。ただ、このヘッダファイルをプリコンパイルヘッダ(stdafx.h)に追加するようですが、そのままだと何故か致命的なコンパイルエラーが出て失敗するのですが、それを外してコンパイルすればビルドが成功します(これらのクラスを使うソースコードに普通にインクルードする)。

DataGridViewなどに表示されるためには、BindingSourceを生成して、テーブルデザイナで定義したDataSetを割り当てればよいです。この操作は、フォームのデザイナを使って、BindingSourceをツールボックスなどで作成して、DataSourceプロパティに定義したDataSetを設定すればよいです。DataSetがうまくコンパイルできていれば一覧に表れるはずです。

ここまでうまくいけば、C#でBindingSourceを使ってデータを表示される手順と同じ要領で、Formのコンストラクタかどこかで、BindingSourceのDataSourceプロパティにDataSetのインスタンスを設定します。すなわち、生成されたヘッダに定義されているDataSetのサブクラスをgcnewしたものをフォームデザイナで生成したBindingSourceのインスタンスのDataSourceに代入するということです。ちなみにフォームのデザイナは、BindingSourceのDataSourceに定義したDataSetのタイプIDを代入していますが、これはそのままにしておいて、そのコードの後に実行されるどこかで、インスタンスをDataSourceに代入してしまってもよいみたいです。

その後コードについては、ドキュメントに書いてあるC#のコードをC++に書き直すつもりでコーディングしていけばうまくいくはずです。簡単な例とすれば、DataSetのサブクラスに定義したDataTableのサブクラスのインスタンスが取得できるプロパティがあるので、そのDataTableのRowsプロパティに、定義されたDataRowのサブクラスのインスタンス(生成はDataTableのNewRowに相当するメソッドが定義されているのでそれを呼び出す)をAddすると項目が追加されると、いった感じです。

0 件のコメント: