Нумерация строк в DataGridView

Как то пришлось мне впервые столкнуться с задачей вывода нумерации строк в DataGridView. Скажу сразу, что тогда я эту задачу решил в самом запросе к SQL БД. Однако, правильне это дело решать на клиентской стороне, непосредственно в самом контроле DataGridView, поскольку дання нумерация строк никоим образом не участвует в обработке данных, а лишь расширяет визуальное восприятие отрисованного грида.


Итак, первый пришедший в голову вариант был подписаться на событие RowPrePaint:

private void dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
   object head = this.dgv.Rows[e.RowIndex].HeaderCell.Value;
    if (head == null || 
       !head.Equals((e.RowIndex + 1).ToString()))
       this.dgv.Rows[e.RowIndex].HeaderCell.Value = 
          (e.RowIndex + 1).ToString();
}
Можно и на событие RowStateChanged:

private void dgv_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
   e.Row.HeaderCell.Value = 
      (e.Row.Index + 1).ToString();
}

Но в таком варианте придется позаботиться об эффекте перерисовки строк.

С еще большей легкостью можно поработать с событием RowsAdded:

private void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
   dgv.Rows[e.RowIndex].HeaderCell.Value = 
      (e.RowIndex+1).ToString();
}

Все эти способы касались установки нумерации в левом вертикальном бордюре грида. Если же необходимо выводить нумерацию в обычном столбце, то здесь уместнее будет подписаться на событие CellFormatting:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
   if (e.ColumnIndex == 0) 
   {
      e.Value = e.RowIndex; 
   }
}

Ну и самый простой вариант, просто пробежаться по всем строкам грида, если строк не очень много

for(int i = 0; i < dgv_marks.Rows.Count; i++)
   dgv_marks.Rows[i].Cells[0].Value = i+1;
Какой вариант вы выберите для себя зависит от ваших предпочтений и конечно же от конкретных условий задачи отрисовки нумерации в DataGridView.
Источник skillcoding.com

Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!