DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGirdViewでの行の結合

環境/言語:[VS2005(C#)/.NET Framework 2.0]
分類:[.NET]

お世話になります。 おんたまと申します。

他の掲示板に投稿したのですが回答を得られなかったためこちらに投稿させて
頂きます。

タイトルのようにDataGirdViewを使用して一番左端の列を数行結合したいと思っています。
結合する行が何行になるかは表示するデータによって異なります。

+-----+-----+-----+-----+-----+
|aaaaa|bbbbb|ccccc|ddddd|eeeee|   <---列ヘッダ  
+-----+-----+-----+-----+-----+ 
|     |  123|  123|  123|  123|
|xxxxx|  123|  123|  123|  123|
|     |  123|  123|  123|  123|
+-----+-----+-----+-----+-----+
|xxxxx|  123|  123|  123|  123|
+-----+-----+-----+-----+-----+

グレープシティの「FlexGrid for .NET」を使用すれば簡単だとは思うのですが
購入できるかどうか解らないのでVSの標準コントロールで実現できないかと
思っています。

色々なHPをのぞいたのですがC#でのサンプルがなく苦戦しています。
手法をご存じの方、サンプルが載っているHPをご存じの方いらっしゃいましたら
教えていただけると助かります。

よろしくお願いいたします。
方針だけですが、もし、やるとしたら自分でセル内を描くしかないでしょう。

まず、DataTableを加工して、
xxxxx 123,123,123  123,123,123  123,123,123  123,123,123
のようなレコードを作成し、DataGridViewを表示する時に、自分で、

+-----+-----+-----+-----+-----+ 
|     |  123|  123|  123|  123|
|xxxxx|  123|  123|  123|  123|
|     |  123|  123|  123|  123|
+-----+-----+-----+-----+-----+

のように描く方法です。
こんにちは、どどっぐと申します。
私も最近DataGirdViewで悩んだので、trapemiyaさんのアイデアを実現するための
参考プログラムを少しだけ紹介しておきます。お役に立てば。
ただtrapemiyaさんとちょっと違うのは1レコードにするのではなく、
3レコードで区切りの罫線を引かないというやり方です。

Paintを自分でやるわけですが、罫線は自分で引いて、文字は親に任せる
ということが出来ないため、セル内の全ての描画をする必要が出てきます。

コンストラクタとかで
this.CellPainting +=
new DataGridViewCellPaintingEventHandler(DataGridView_CellPainting);
とイベントハンドラを設定して、

private void DataGridView_CellPainting(
object sender, DataGridViewCellPaintingEventArgs e) {

if (e.RowIndex と e.ColumnIndex が結合範囲外なら) {
return; //描画は親に任せた!(e.Handled = falseで返る)
//returnせずにこれも書いちゃってもいいのですが……
}

using (Brush gridBrush = new SolidBrush(this.GridColor)
,backColorBrush = new SolidBrush(e.CellStyle.BackColor)
//,foreColorBrush = new SolidBrush(e.CellStyle.ForeColor)
)
{
using (Pen gridLinePen = new Pen(gridBrush)
,backColorPen = new Pen(backColorBrush)
//,foreColorPen = new Pen(foreColorBrush)
)
{
// Erase the cell.
e.Graphics.FillRectangle(backColorPen, e.CellBounds);

// Draw the grid lines (only the right and bottom lines;
// DataGridView takes care of the others).
if (結合最下行ならば) { //(つまり中行なら下線を引かない)
//グリッド下線を引く
e.Graphics.DrawLine(gridLinePen,
e.CellBounds.Left, e.CellBounds.Bottom - 1,
e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);
}
//グリッド右線
e.Graphics.DrawLine(gridLinePen,
e.CellBounds.Right - 1, e.CellBounds.Top,
e.CellBounds.Right - 1, e.CellBounds.Bottom -1);

// Draw the inset highlight box.
//e.Graphics.DrawRectangle(foreColorPen, newRect); とか…

// 中の文字を書く(valign=middle)
if (e.Value != null) {
StringFormat sFormat = new StringFormat();
sFormat.LineAlignment = StringAlignment.Center;
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
Brushes.White, e.CellBounds.X,
e.CellBounds.Y + e.CellBounds.Height/2, sFormat);
}
e.Handled = true; //描画したよ〜印
}
}
}

といった感じで描画します。似たようなプログラムをちょっと雰囲気で
サンプル化しただけなので、とんでもなく間違っていたら御免なさい。

あー選択位置処理は……分かりません……trapemiyaさんの1レコード方式が
良いかも……
trapemiyaさん、どどっぐさん、ありがとうございます。

どどっぐさんのソースを参考に実装してみたいと思います。

ただ、なんにしても一筋縄ではいかなさそうですね^^;

がんばってみます。
ありがとう御座いました。

DOBON.NET | プログラミング道 | プログラミング掲示板