1、用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号
private void dgGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();
var centerFormat = new StringFormat()
{
// right alignment might actually make more sense for numbers
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}
不过这种方式在数据量较大的情况下性能会很差。
2、利用RowsAdded,和RowsRowsRemoved事件来处理行号,这种方式可以大大的提高性能。
private void dgvinfo_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
for (int i = 0; i < e.RowCount; i++)
{
dgvinfo.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvinfo.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();
}
}
private void dgvinfo_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
for (int i = e.RowIndex + e.RowCount; i < this.dgvinfo.Rows.Count; i++)
{
dgvinfo.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvinfo.Rows[i].HeaderCell.Value = (i + 1).ToString();
}
}
第二种方法要注意将DataGridView的RowsHeaderWidthSizeMode属性设置为AutoSizeToAllHeaders或者AutoSizeToDisplayedHeaders,这样自动设置宽度就不会出现行指示符挤压行号导致看不见的情况了。
3、对于只需要做数据展示,而不需要编辑的数据就更简单了。
private void dgvInfo_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);
}