はじめに
私のところには、プログラミングに関するさまざまな質問が電子メールで送られてきます。できる限りすべての問題を解決するように努力していますが、ランダムな質問の多くはパブリックニュースグループの方へ回しています。それでも、自分で調べずにはいられない興味深い質問もあります。先日も、友人から次のようなメールが届きました。
「Webページに表形式で値を表示しているんだ。そのうちの1つの列に、表中の値に基づくシンプルな小さい横棒グラフを表示している。この横棒グラフは単色のビットマップで、グラフの長さはフィールドの値を示している。このグラフの横にはフィールド値も表示している。単純な表にこういう視覚情報を加えるのはすごく効果的だと思うんだ。これをDataGridViewコントロールで行うにはどうすればいいかな?」
私の予想に反して、少し調べてみると、DataGridViewに新しい列タイプを作成すればこれを実現できることがわかりました。Visual Studio 2003のGridViewコントロールで非常に苦労した経験から、初めは不安でした。ところが、.NETの世界ではよくあるように、以前は難しかったこの処理も今は簡単に実現できることがわかりました。私はすぐにサンプルを作成して友人へ送りました。今回は、それにもう少し手を加えたものを紹介します。
この記事では、DataGridViewコントロールのカスタム列タイプの作成方法を説明するために、横棒グラフを表示するセルタイプのサンプルを見ていきます。このサンプルの作成方法を習得すれば、今度はもっと複雑な列タイプも作成できるようになるでしょう。
以降では、図1のフォームのようなサンプルを作成します。このフォームには、SQL Server 2000 Northwindサンプルデータベースのデータを使用していますが、他のテーブルを使って作ってみることもできます。ただ、整数列が含まれるデータソースを使用してください。また、横棒グラフの長さは、セルの境界内に収まるように調整されます(個々の長さは列の最大値に基づいて決定します)。列幅を広げると、横棒グラフの長さも列幅に合わせて長くなります。図2は、このサンプルの列の動作を示すため、同じ列を3種類の列幅で表示したものです。
DataGridViewのカスタム列タイプ作成の基本概念は単純です。DataGridViewCellクラスを継承する独自のセルクラス(またはDataGridViewCellクラスを継承するクラスを継承するクラス)を作成します。このセルクラスでは、基本クラスの多数のプロテクトメンバをオーバーライドできます。たとえば、この記事のサンプルのようにセルの内容の描画方法を変更する場合は、クラスのPaint
メソッドをオーバーライドします。
セルクラスを作成したら、次はDataGridViewColumnクラスを継承するクラスを作成します。このクラスでも多くのメンバをオーバーライドできますが、通常、その必要はありません。必要なのは、このクラスのコンストラクタ内でCellTemplateプロパティを設定することだけです。最後に、DataGridViewの設定で、目的の列に新しい列タイプを指定すれば完了です(かつては、GridViewの中にComboBoxコントロールを表示する列を作成するには何百行ものコードを書かなければなりませんでした。辛抱強く待った甲斐があるというものです)。