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

DataGridVeiw のグリッド線を破線にカスタマイズしたい

環境/言語:[Windows7 C# VS2010]
分類:[.NET]

お世話になります。

DataGridView のグリッド線は一重線がデフォルト値です。
これを破線(点線)にカスタマイズしたいと思っています。


dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.Custom;
のCustom列挙値の設定をしましたがエラーが出ます。

CellPaintingイベントも考えたのですが、このあとの処理がわかりません。
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.InsetDouble;
}

よろしくお願いします。
■No31616に返信(finedbさんの記事)
> DataGridView のグリッド線は一重線がデフォルト値です。
> これを破線(点線)にカスタマイズしたいと思っています。

http://dobon.net/vb/dotnet/datagridview/ownerdrawcell.html
の流用で、ソレっぽいものはできますが……。
# 厳密には境界線の位置がヘン。

Formのメンバに
Pen DotPen;
を加えます。

Formのコンストラクタで
DotPen = new Pen(Color.Red);
DotPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
として、破線のPenを作成します。(色はとりあえず適当)

んで、CellPainting()ハンドラを下記のように…
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
 if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
 {
  DataGridView Target = (DataGridView)sender;

  // 背景塗りつぶし
  e.Graphics.FillRectangle(new SolidBrush(((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected) ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor), e.CellBounds);
  // 境界線以外を描画
  e.Paint(e.ClipBounds, e.PaintParts & ~(DataGridViewPaintParts.Border));
  // 境界線の色を設定
  DotPen.Color = Target.GridColor;
  // 境界線を描画
  e.Graphics.DrawRectangle(DotPen, e.CellBounds);
  // 描画が完了したことを知らせる
  e.Handled = true;
 }
}

特定のe.ColumnIndexとe.RowIndexでこの処理をしないようにすると判りますが、微妙に位置がズレてます。
# && !(e.ColumnIndex == 1 && e.RowIndex == 1) として、1,1の部分は処理しない…としてみると判る。
# そして、右側と下側の境界線が描画されない。
ありがとうございます。

コードを試したら、うまくいきました。

グリッド線が少しずれているということですが、これで十分です。
またよろしくおねがいします。
■No31623に返信(finedbさんの記事)
> グリッド線が少しずれているということですが、これで十分です。
> またよろしくおねがいします。

DrawRectangle()で描画していたのが問題…だったのかもしれません。
デフォルトだとセルの境界線は右側と下側のものしか描画しないみたいですし。

と言うわけで、ちょっと変えてみました。
位置がおかしくなる。というのは回避されるかと。
# 境界線の太さが1じゃない場合は破線に見えないかも知れませんが。

 if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
 {
  DataGridView Target = (DataGridView)sender;

  // ハッチで塗りつぶし
  e.Graphics.FillRectangle(new System.Drawing.Drawing2D.HatchBrush(System.Drawing.Drawing2D.HatchStyle.Percent50, ((DataGridView)sender).GridColor, ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected) ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor), e.CellBounds);
  // 境界線以外を描画
  e.Paint(e.ClipBounds, e.PaintParts & ~(DataGridViewPaintParts.Border));
  // 描画が完了したことを知らせる
  e.Handled = true;
 }

まぁ、この方法でも外部からCellBorderStyleとか参照されると実態と異なることになりますけどね。

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