C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Datagridのセル結合


(過去ログ 141 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■82656 / inTopicNo.1)  Datagridのセル結合
  
□投稿者/ ぽっと (1回)-(2017/01/23(Mon) 18:04:23)

分類:[C#] 

以下のコードでDatagridの1列目を結合のようなものをしています。
画面表示後に列幅の変更や行幅を変更すると、1列目に前の残像が残ってしまいます。(1列目に必要ない罫線や2列目以降の値が表示され続ける)
1列目が幅変更後に正常に再描写されていないのが原因かと思うのですが、どのようなコードを記述すれば回避できるでしょうか。
2列目以降は正常に描写されています。
    void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {

            e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;

            if (e.RowIndex < 1 || e.ColumnIndex < 0)
                return;
            
            if (e.ColumnIndex == 0)
            {
                // セルの上側の境界線を「境界線なし」に設定
                e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None;

                // 罫線のみ表示
                DataGridViewPaintParts paintParts = e.PaintParts & DataGridViewPaintParts.Border;
                e.Paint(e.ClipBounds, paintParts);
                e.Handled = true;
            }
            else
            {
                // セルの上側の境界線を既定の境界線に設定
                e.AdvancedBorderStyle.Top = dataGridView1.AdvancedCellBorderStyle.All;
            }
        }

引用返信 編集キー/
■82678 / inTopicNo.2)  Re[1]: Datagridのセル結合
□投稿者/ 魔界の仮面弁士 (1084回)-(2017/01/26(Thu) 13:36:19)
No82656 (ぽっと さん) に返信
> 以下のコードでDatagridの1列目を結合のようなものをしています。

DataGrid と DataGridView は別物なのでご注意を。
https://msdn.microsoft.com/ja-jp/library/ms171628%28vs.90%29.aspx


> // セルの上側の境界線を「境界線なし」に設定
> e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None;

セルの枠線を消したいだけならば、独自描画は不要です。

CellStyle や AdvancedBorderStyle を調整した後は、
e.Paint 等の呼び出しや、e.Handled を true にしたりせず、
そのままイベント処理を抜けるだけです。


> 画面表示後に列幅の変更や行幅を変更すると、1列目に前の残像が残ってしまいます。(1列目に必要ない罫線や2列目以降の値が表示され続ける)

これは『罫線のみ表示』して、背景色やコンテンツを描画していないからですね。

たとえば、
 DataGridViewPaintParts paintParts = e.PaintParts & (DataGridViewPaintParts.Border | DataGridViewPaintParts.Background);
 e.Paint(e.ClipBounds, paintParts);
 e.Handled = true;
あるいは
 DataGridViewPaintParts paintParts = e.PaintParts & DataGridViewPaintParts.Border;
 e.PaintBackground(e.CellBounds, true);
 e.Paint(e.ClipBounds, paintParts);
 e.Handled = true;
といった具合にしてみてください。


> どのようなコードを記述すれば回避できるでしょうか。

上記の対処だけで十分なケースもありますが、それでは不足することもあります。
罫線を消すだけで済むかどうかはアプリケーションの要件次第です。


たとえば

・背景を単色で塗らず、マージされた区間をまたいだグラデーションをかけたい
・コンテンツを、マージされたセル内で垂直中央寄せにしたい
・単一セルを分割したい(3行分の領域を上下 1.5 行ずつに分けて使うなど)
・マージされているセルが選択された場合に、
 マージされたセル全体が反転するようにしたい
・垂直スクロールで、マージされた行の一部が隠れた場合に、
 表示されている行の範囲内でコンテンツを描画させたい

などといった要件の場合、描画範囲は e.CellBounds にとどまりません。

マージされた隣り合ったセルの座標を調べ、その領域全体に対して
描画処理を実装するようにしてみてください。。

また、描画処理も e.Paint / e.PaintContent / e.PaintBackground では
機能的に不足する場合、Graphics、TextRenderer、ControlPaint あるいは
VisualStyleRenderer 等で代替することも検討してみて下さい。
引用返信 編集キー/
■82683 / inTopicNo.3)  Re[2]: Datagridのセル結合
□投稿者/ ぽっと (2回)-(2017/01/26(Thu) 15:53:21)
魔界の仮面弁士様ありがとございます。

>これは『罫線のみ表示』して、背景色やコンテンツを描画していないからですね。
ご指摘のとおりでした。

>上記の対処だけで十分なケースもありますが、それでは不足することもあります。
>罫線を消すだけで済むかどうかはアプリケーションの要件次第です。
勉強になりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -