■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 等で代替することも検討してみて下さい。
|
|