それではここまでに登場したオブジェクトについてより理解を深めるために、実際にコードを記述してみよう。ここでは次の画面のようなグリッドを表示するプログラムを記述していく。
DGVコントロールにデータを表示するためのプログラミングは、基本的に以下のような手順となる。Visual Studio 2005のIDEや、DGVコントロールのデータ・バインディング機能(次回で解説予定)を使えば、(2)や(3)の手順はコードを記述せずとも可能だが、今回はすべて明示的にコーディングを行っていく。
(1)DGVクラス(DGVコントロール)のインスタンス化
(2)列オブジェクトの追加
(3)行オブジェクトの追加(=データの追加)
例えばデータベースでは、最初にスキーマ(カラムとなる項目)を決めてからしかレコードを追加できないように、DGVコントロールでもまず列オブジェクトを追加しておき、その列の種類に従ったいくつかのセルを含む行オブジェクトを追加していくことになる。
■列オブジェクトの作成と追加
手順(1)のDGVクラスのインスタンス化は単にクラスを「New」するだけだ。
Dim dgv As New DataGridView()
DataGridView dgv = new DataGridView();
DGVオブジェクトは通常のコントロールと同様に、フォームのControlsプロパティに追加すればフォーム上に表示される。
次に、列で表示したいデータの種類に対応した列オブジェクトを作成する。ここでは第1列でテキスト、第2列で画像を表示するので、テキストボックス列とイメージ列を使用する。
Dim column1 As New DataGridViewTextBoxColumn
column1.HeaderText = "1列目の見出し"
Dim column2 As New DataGridViewImageColumn
column2.HeaderText = "2列目の見出し"
DataGridViewTextBoxColumn column1 = new DataGridViewTextBoxColumn();
column1.HeaderText = "1列目の見出し";
DataGridViewImageColumn column2 = new DataGridViewImageColumn();
column2.HeaderText = "2列目の見出し";
またここでは列ヘッダに見出しを表示するために、「HeaderTextプロパティ」に見出し用の文字列を設定している。このプロパティはグリッドが表示されているときにも読み書きが可能だ。
さて、DGVクラスのプロパティの中で列オブジェクトを管理するのは先ほどの図でも登場した「Columnsプロパティ」である。作成した列オブジェクトは、このプロパティに追加していくことにより、実際にDGVコントロールに列がセットされることになる。
dgv.Columns.Add(column1)
dgv.Columns.Add(column2)
dgv.Columns.Add(column1);
dgv.Columns.Add(column2);
ちなみに、Visual Studio 2005を使っている場合には、DGVコントロールをツールボックスからドラッグ&ドロップし、[DataGridViewタスク]メニューから列の追加を選択すれば、ダイアログから列を追加できる。
(3)の型を選択するコンボボックスでは、上述した6種類の列が選択できるはずだ。なお、[列の追加]ダイアログには「データ・バインド列」と「非バインド列」の2つの列があるが(上記の画面ではデータ・バインド列はグレイアウトしている)、この列の違いについては次回で解説する予定だ。
■行オブジェクトの作成と追加
DGVコントロールに列オブジェクトを作成し追加したら、次に行(=実データ)を追加していこう。
行の追加では、行オブジェクトを作成して追加し、さらにセル・オブジェクトを作成して追加するといった明示的な作業をしなくても、DGVコントロールのRowsプロパティのAddメソッドを利用すれば、メソッドのパラメータに実際のデータを並べて書くだけでよい*。
* このメソッドのドキュメントを見ると「独自に作成したコードから直接使用するためのものではありません」と書かれているが、方法 : Windows フォーム DataGridView コントロールの並べ替え機能をカスタマイズするにあるサンプル・プログラムなどでは堂々と使われている。
ここではAddメソッドに渡すパラメータとして、文字列とアイコン*を指定する。イメージ列に対してはIconオブジェクトかImageオブジェクトが指定可能だ。
dgv.Rows.Add("Asterisk", SystemIcons.Asterisk)
dgv.Rows.Add("Error", SystemIcons.Error)
dgv.Rows.Add("Exclamation", SystemIcons.Exclamation)
dgv.Rows.Add("Question", SystemIcons.Question)
dgv.Rows.Add("Asterisk", SystemIcons.Asterisk);
dgv.Rows.Add("Error", SystemIcons.Error);
dgv.Rows.Add("Exclamation", SystemIcons.Exclamation);
dgv.Rows.Add("Question", SystemIcons.Question);
* SystemIconsクラスはWindowsシステムで共通のアイコンをIconオブジェクトとして取得できるクラスである。ここでこのクラスを使っているのは、単にアイコン・オブジェクトが簡単に得られるという理由からだ。
このようなAddメソッドの呼び出しによりセル・オブジェクトや行オブジェクトが自動的に作成され、DGVコントロールに追加されることになる。
■行オブジェクトの作成と追加の別の方法
DGVコントロールへのデータの追加にはいくつかの記述方法がある。次に示すコードでは、まず空の行を追加し、その後各セルにデータを設定している。セルの値を読み書きするにはセル・オブジェクトの「Valueプロパティ」を使用する。
Dim rowIndex As Integer = dgv.Rows.Add()
dgv.Rows(rowIndex).Cells(0).Value = "Asterisk"
dgv.Rows(rowIndex).Cells(1).Value = SystemIcons.Asterisk
int rowIndex = dgv.Rows.Add();
dgv.Rows[rowIndex].Cells[0].Value = "Asterisk";
dgv.Rows[rowIndex].Cells[1].Value = SystemIcons.Asterisk;
Addメソッドが返す値は、それにより追加された行オブジェクトのインデックス、つまり行番号である(0始まり)。行番号が得られれば、
dgv.Rows(<行番号>).Cells(<列番号>)
により、1つのセル・オブジェクトを参照することができるため、そのValueプロパティにより特定の位置のセルの値を読み書きできる(C#では“( )”の代わりに“[ ]”を使用)。
また、DGVコントロールには行番号と列番号を指定して直接セルにアクセスするためのインデクサも用意されているため、行への値の設定には次のような記述も可能だ。
dgv(0, rowIndex).Value = "Asterisk" ' 1列目の値
dgv(1, rowIndex).Value = SystemIcons.Asterisk ' 2列目の値
dgv[0, rowIndex].Value = "Asterisk"; // 1列目の値
dgv[1, rowIndex].Value = SystemIcons.Asterisk; // 1列目の値
実際には、セルのValueプロパティに対してこのように直接データを設定するような機会は少ないのだが、指定されたセルの値を得るためにValueプロパティを読み出すケースは少なくない*。
* Valueプロパティの型はObject型なので、データを読み出すときには通常ダウン・キャスト(例えばInteger型やString型へのキャスト)が必要となる。
Copyright© Digital Advantage Corp. All Rights Reserved.