none
DataGridView セルの罫線を変更したい RRS feed

  • 質問

  • お世話になります。

    DataGridViewのセルに罫線を描いたり消したりしたいのですが、

    ボタンを押されたタイミングで行いたいです。

     

    希望はExcelVBAの様に、

    ①対象の個別セルを指定し

    ②Styleをセット

    という流れで出来ればと考えていますが

    検索すると、

    ・DataGridView.CellPainting

    ・DataGridView.RowPostPaint

    など、描写タイミングで罫線を描いたり消したりしていました。

     

    イメージとしては

    DataGridViewCell cell = DataGridView.Rows[0].Cells[0];

    cell.Style= 縦線

    のように出来ればと思いますが可能でしょうか。

     

    環境はC#2005です。

    是非、ご教示の程、よろしくお願いいたします。

     

    2009年1月15日 2:36

回答

  • こんばんは!(^^)!ふ~です。

     

    >2行目、4カラム目のセルの[境界線]右縦、下線だけ赤色表示にしたいのです。

       3カラム目のセルになってますので、少々計算が必要です。

     

    Code Snippet

      void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
      {
       DataGridView dgv = (DataGridView)sender;

       // 2行目のみ
       if ( e.RowIndex == (2 - 1) )
       {
        DataGridViewColumn column1 = dataGridView1.Columns["No."];
        DataGridViewColumn column2 = dataGridView1.Columns["名前"];
        DataGridViewColumn column3 = dataGridView1.Columns["得点"];

        //線を引く位置を計算する
        int startX = dgv.RowHeadersVisible ? dgv.RowHeadersWidth : 0;
        int startY = e.RowBounds.Top + e.RowBounds.Height - 1;
        int startYTop = e.RowBounds.Top;

        //下線を引く
        e.Graphics.DrawLine( new Pen(Color.Red, 2),
         startX + column1.Width, startY,
            startX + column1.Width + column2.Width, startY);

        //右縦を引く
        e.Graphics.DrawLine( new Pen(Color.Red, 2),
         startX + column1.Width + column2.Width,
            startYTop, startX + column1.Width + column2.Width, startY);
       }
      }

     

     

    2009年1月16日 11:23

すべての返信

  • こんばんは!(^^)!ふ~です。

     

    ご参考資料です。

    ◆DataGridViewの行を自分で描画する

    http://dobon.net/vb/dotnet/datagridview/rowpostpaint.html

    2009年1月15日 13:59
  • !(^^)!ふ~さん

    ご無沙汰してます。ありがとうございます。

     

    参考URLもRowPostPaintイベントハンドラ内で

    実装しています。

     

    ボタンクリックイベント内で処理したいので

    e(DataGridViewRowPostPaintEventArgs)が取れなくて

    このページも拝見したのですが、断念しました。

     

    e(DataGridViewRowPostPaintEventArgs)⇒セル(DataGridViewCellとか)へ変換

    できれば・・・と考えています。

     

    お手数をおかけします。よろしくお願いします。

    2009年1月15日 16:12
  •  AriAriビスカス さんからの引用

    参考URLもRowPostPaintイベントハンドラ内で

    実装しています。

     

    ボタンクリックイベント内で処理したいので

    e(DataGridViewRowPostPaintEventArgs)が取れなくて

    このページも拝見したのですが、断念しました。

    ボタンクリックイベントで描画条件を設定して

    InvalidateCellメソッドを呼び、

    RowPostPaint イベントで描画条件を判断して描画するとか。

     

    MSDN

         DataGridView

    InvalidateCell メソッド (DataGridViewCell)

    2009年1月15日 19:24
  • karashimaさん

    ありがとうございます。早速試したいと思います。

    ちょっと関連なのですが、DataGridView.CellPaintingで境界線を引くと

    画面の「ちらつき」が発生し、困っています。

    使い方が間違っていたらご指摘いただけたら幸いです。

     

    1.[境界線なしを設定]

    DataGridView.CellBorderStyle = DataGridViewCellBorderStyle.None;

    2.DataGridView.CellPaintingイベントに対象セルなら[境界線]を設定し、線を引いたように見せる

    例)2行目、3カラムの[右縦][下]に線を引く

     

    if (e.RowIndex == 1 && e.ColumnIndex == 2)
    {
        e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Single;
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.Single;
    }
    else
    {
        e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;
    }

    どうやらDataGridView.CellPaintingが常にloopしている為、

    毎回esle処理を繰り返し、ちらついているようなのです。

     

    大変お手数ですが、どうぞよろしくお願いいたします。

    2009年1月15日 22:42
  • こんにちは!(^^)!ふ~です。

     

     AriAriビスカス さんからの引用

     

    参考URLもRowPostPaintイベントハンドラ内で

    実装しています。

     

    ボタンクリックイベント内で処理したいので

    e(DataGridViewRowPostPaintEventArgs)が取れなくて

    このページも拝見したのですが、断念しました。

     

    e(DataGridViewRowPostPaintEventArgs)⇒セル(DataGridViewCellとか)へ変換

    できれば・・・と考えています。

     

    もそっと、単純に考えて見ましたが。。。

     

    Code Snippet

    using System;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace DataGridViewLine
    {
     public partial class Form1 : Form
     {
      static bool bTrgF = false;

      public Form1()
      {
       InitializeComponent();
       MakeTable();
      }

      private void button1_Click(object sender, EventArgs e)
      {
       if (bTrgF ^= true)
       {
        dataGridView1.RowPostPaint +=

          new DataGridViewRowPostPaintEventHandler(dataGridView1_RowPostPaint);
       }
       else
       {
        dataGridView1.RowPostPaint -=

          new DataGridViewRowPostPaintEventHandler(dataGridView1_RowPostPaint);
       }
       dataGridView1.Refresh();
      }

      void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
      {
       DataGridView dgv = (DataGridView)sender;

       //線の色を決定する
       Pen linePen;
       switch (e.RowIndex % 3)
       {
        case 0:
         linePen = Pens.Blue;
         break;
        case 1:
         linePen = Pens.Green;
         break;
        default:
         linePen = Pens.Red;
         break;
       }

       //線を引く位置を計算する
       int startX = dgv.RowHeadersVisible ? dgv.RowHeadersWidth : 0;
       int startY = e.RowBounds.Top + e.RowBounds.Height - 1;
       int endX = startX + dgv.Columns.GetColumnsWidth(
        DataGridViewElementStates.Visible) -
        dgv.HorizontalScrollingOffset;

       //線を引く
       e.Graphics.DrawLine(linePen,
        startX, startY, endX, startY);
      }
      
      /// <summary>
      /// dataGridView1にテストデータを設定する
      /// </summary>
      private void MakeTable()
      {
       // Create a new DataTable.
       DataTable table = new DataTable("testTable");
       DataColumn column;
       DataRow row;

       // Create first column and add to the DataTable.
       column = new DataColumn();
       column.DataType = System.Type.GetType("System.Int32");
       column.ColumnName = "No.";
       column.AutoIncrement = true;
       column.Caption = "ID";
       column.ReadOnly = true;
       column.Unique = true;

       // Add the column to the DataColumnCollection.
       table.Columns.Add(column);

       // Create second column.
       column = new DataColumn();
       column.DataType = System.Type.GetType("System.String");
       column.ColumnName = "名前";
       column.AutoIncrement = false;
       column.Caption = "Name";
       column.ReadOnly = false;
       column.Unique = false;
       table.Columns.Add(column);

       // Create third column.
       column = new DataColumn();
       column.DataType = System.Type.GetType("System.Int32");
       column.ColumnName = "得点";
       column.AutoIncrement = false;
       column.Caption = "Score";
       column.ReadOnly = false;
       column.Unique = false;
       table.Columns.Add(column);

       dataGridView1.DataSource = table;

       // Create three sets of DataRow objects,
       // five rows each, and add to DataTable.
       for (int i = 0; i <= 4; i++)
       {
        row = table.NewRow();
        row["No."] = i;
        row["名前"] = "PoNiyo " + i;
        row["得点"] = 10;
        table.Rows.Add(row);
       }
       for (int i = 0; i <= 4; i++)
       {
        row = table.NewRow();
        row["No."] = i + 5;
        row["名前"] = "PoNiyo " + i;
        row["得点"] = 20;
        table.Rows.Add(row);
       }
       for (int i = 0; i <= 4; i++)
       {
        row = table.NewRow();
        row["No."] = i + 10;
        row["名前"] = "PoNiyo " + i;
        row["得点"] = 30;
        table.Rows.Add(row);
       }
      }
     }
    }

     

     

    2009年1月16日 3:55
  • こんにちは!(^^)!ふ~です。

     

     AriAriビスカス さんからの引用

    if (e.RowIndex == 1 && e.ColumnIndex == 2)
    {
        e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Single;
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.Single;
    }
    else
    {
        e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;
        e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;
    }

    どうやらDataGridView.CellPaintingが常にloopしている為、

    毎回esle処理を繰り返し、ちらついているようなのです。

     

    設定変更することで、イベントが発生、そのイベント処理の中で、同じイベントが発生してまたその処理のなかで。。。

    と発信器のようになっている気もいたします。

     

    ご参考資料

    ◆DataGridViewコントロールの連続する同じ値のセルを1つにまとめるには?[2.0のみ、C#、VB]
    http://www.atmarkit.co.jp/fdotnet/dotnettips/593dgvgroupedcell/dgvgroupedcell.html

     

    2009年1月16日 4:06
  •  AriAriビスカス さんからの引用

    ちょっと関連なのですが、DataGridView.CellPaintingで境界線を引くと

    画面の「ちらつき」が発生し、困っています。

    使い方が間違っていたらご指摘いただけたら幸いです。

     

    1.[境界線なしを設定]

    DataGridView.CellBorderStyle = DataGridViewCellBorderStyle.None;

    上記を設定するのをやめた場合は、どうなりますか?

    2009年1月16日 5:45
  • !(^^)!ふ~さん

     

    ありがとうございます。

    記載サンプルは動きました。

     

    でも、やりたいことは、

    ボタンが押されたら、ある特定セルに対してのみ描写の動作で

    例えば

    2行目、4カラム目のセルの[境界線]右縦、下線だけ赤色表示にしたいのです。

    他はそのままで。。。

     

    可能でしょうか。

    もう少しお付き合いいただければ助かります。

     

    よろしくお願いいたします。

    2009年1月16日 8:05
  • karashimaさん

     

    ありがとうございます。[ちらつき]が無くなりました。

    代わりに、ヘッダー部あたりに変な(指定色と違う)太線が表示されているセルが発生したり。。。

    うまくいきませんね。。。

    2009年1月16日 9:44
  • こんばんは!(^^)!ふ~です。

     

    >2行目、4カラム目のセルの[境界線]右縦、下線だけ赤色表示にしたいのです。

       3カラム目のセルになってますので、少々計算が必要です。

     

    Code Snippet

      void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
      {
       DataGridView dgv = (DataGridView)sender;

       // 2行目のみ
       if ( e.RowIndex == (2 - 1) )
       {
        DataGridViewColumn column1 = dataGridView1.Columns["No."];
        DataGridViewColumn column2 = dataGridView1.Columns["名前"];
        DataGridViewColumn column3 = dataGridView1.Columns["得点"];

        //線を引く位置を計算する
        int startX = dgv.RowHeadersVisible ? dgv.RowHeadersWidth : 0;
        int startY = e.RowBounds.Top + e.RowBounds.Height - 1;
        int startYTop = e.RowBounds.Top;

        //下線を引く
        e.Graphics.DrawLine( new Pen(Color.Red, 2),
         startX + column1.Width, startY,
            startX + column1.Width + column2.Width, startY);

        //右縦を引く
        e.Graphics.DrawLine( new Pen(Color.Red, 2),
         startX + column1.Width + column2.Width,
            startYTop, startX + column1.Width + column2.Width, startY);
       }
      }

     

     

    2009年1月16日 11:23
  • !(^^)!ふ~さん

     

    サンプルソースありがとうございます。

    実行できました。

    お力添えいただき大変ありがとうございました。

     

    2009年1月17日 1:18