Как то пришлось мне впервые столкнуться с задачей вывода нумерации строк в 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.
шаблон значений ячеек новой строки в DataGridView