2015-04-24 4 views
-1

Рисовать красную линию внутри ячеек данных datagridview

Как добавить красную линию в ячейку?

private void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
    { 
     var dg = (DataGridView)sender; 

     if (e.ColumnIndex == -5 || e.RowIndex != (dg.RowCount -1)) 
      return; 

     using (var p = new Pen(Color.Red, 1)) 
     { 
      var cellBounds = e.CellBounds; 

      const int size = 2; 
      var pts = new List<Point>(); 
      var h = false; 
      for (int i = cellBounds.Left; i <= cellBounds.Right; i += size, h = !h) 
      { 
       pts.Add(
        new Point 
        { 
         X = i, 
         Y = h ? cellBounds.Bottom : cellBounds.Bottom + size 
        }); 
      } 

      e.Graphics.DrawLines(p, pts.ToArray()); 
     } 
    } 

    private void dataGridView_Paint(object sender, PaintEventArgs e) 
    { 
     dataGridView.CellPainting += dataGridView_CellPainting; 
    } 
+2

Можете ли вы рассказать нам, где в коде, который у вас есть, или что-то непонятное ... пожалуйста, также читайте о том, как задать вопрос .. Я также хотел бы знать, действительно ли вы использовали отладчик и прошел через код устанавливая точки останова .. и определяя, какая строка (-ы) вызывает проблему, делает простой поиск в Google, на самом деле есть тонны рабочего примера, как это сделать здесь, здесь: http://stackoverflow.com/questions/26120268/ drawing-a-horizontal-line-in-a-datagridview-cell – MethodMan

+1

Не нужно добавлять обработчик событий 'dataGridView_CellPainting' в каждый вызов' dataGridView_Paint'! Но только один раз, возможно, в конструкторе Form или еще лучше, просто в дизайнере! – TaW

+0

Вы решили свои проблемы? – TaW

ответ

0

Есть несколько проблем с вашим кодом:

  • Все эти очки, которые вы создаете на самом деле не имеет смысла вообще. Для рисования линии вам понадобятся только две точки, а для серии из n строк - ряд n + 1 балл.

  • Не добавляйте больше и больше обработчиков для CellPainting! Каждый звонок от dataGridView_Paint добавляет еще один. Все это нужно удалить. Добавьте обработчик в конструктор!

  • CellPainting событие имеет несколько правил, чтобы следовать:

    • Если ручка чертежа вам нужно обрабатывать все его, в том числе рисунок фона и содержание
    • Чтобы сделать вашу жизнь (много), для этого есть готовые вызовы, прямо в парамере e
    • Если вы хотите обработать чертеж, вам необходимо прервать чертеж системы, установив e.Handled = true;

Вот код, который рисует красную линию под каждую клетку, в том числе RowHeader:

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    var dg = (DataGridView)sender; // a short reference 
    if (e.ColumnIndex == -5 || e.RowIndex != (dg.RowCount - 1)) 
     return; 

    using (var p = new Pen(Color.Red, 1)) 
    { 
     var cb = e.CellBounds; // a short reference 

     e.PaintBackground(e.ClipBounds, true); 
     e.PaintContent(e.ClipBounds); 
     e.Graphics.DrawLine(p, cb.X, cb.Y + cb.Height, cb.X + cb.Width, cb.Y + cb.Height); 

     e.Handled = true; 
    } 
} 

Я оставил его, но мне интересно, что e.ColumnIndex == -5 подразумевается сделать; может быть, опечатка? Чтобы исключить RowHeader, измените его на e.ColumnIndex < 0, иначе оставьте это!