在DataGridView中实现自动生成行序号,可以通过以下两种方式实现:
一、RowPostPaint事件绘制行号(推荐)
订阅RowPostPaint事件
在事件中动态绘制行号,此方法支持排序/过滤后的自动更新。
核心代码:
private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
// 动态计算行头宽度以适应序号位数
SizeF strSize = e.Graphics.MeasureString((e.RowIndex + 1).ToString(),
dataGridView1.RowHeadersDefaultCellStyle.Font);
if (strSize.Width + 20 > dataGridView1.RowHeadersWidth)
dataGridView1.RowHeadersWidth = 20 + (int)strSize.Width;
// 绘制序号
Rectangle rect = new Rectangle(
e.RowBounds.Left,
e.RowBounds.Top,
dataGridView1.RowHeadersWidth - 4,
e.RowBounds.Height);
TextRenderer.DrawText(
e.Graphics,
(e.RowIndex + 1).ToString(),
dataGridView1.RowHeadersDefaultCellStyle.Font,
rect,
dataGridView1.RowHeadersDefaultCellStyle.ForeColor,
TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}
二、通过数据源生成序号(静态)
在数据源中创建自增列(如DataTable),但此方法在排序/过滤后序号不会动态更新。
示例代码:
DataTable dt = new DataTable();
dt.Columns.Add("序号", typeof(int)).AutoIncrement = true;
dt.Columns.Add("数据列");
dataGridView1.DataSource = dt;
选择建议
动态场景:优先使用RowPostPaint事件方案,支持实时更新且不依赖数据源;
静态场景:数据源绑定方式更简单,但需注意排序后需手动刷新序号
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。