让DataGridView显示行号,去除空记录行

本文介绍如何在WinForm应用程序中的DataGridView控件上显示行号。通过自定义RowPostPaint事件,可以在不使用SQL语句的情况下轻松实现行号显示。此外,还介绍了如何隐藏最后一条空记录及调整列设置的方法。

做的 winform 中要让 DataGridView 显示出每行的行号来,并不需要用sql等语句写,烦。

加入下端即可。

 

        private void dgvGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
                                                e.RowBounds.Location.Y,
                                                this.dgvGridView.RowHeadersWidth - 4,
                                                e.RowBounds.Height);

            TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
                                    this.dgvGridView.RowHeadersDefaultCellStyle.Font,
                                    rectangle,
                                    this.dgvGridView.RowHeadersDefaultCellStyle.ForeColor,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
        }

 

加上这段即可实现。

 

图片

 

要不想像在页面的最左面显示行号,在属性Columns选项中,添加一列,不要命名Name,只有命名显示出来的 HeaderText 就可以了,当然要将 RowHeadersVisible 设为 false。

 

 

 

加上下面这句就不会显示出最后一条空记录了

this.dataGridView1.AllowUserToAddRows = false;属性里设置也可

private void Select_button_Click(object sender, EventArgs e) { recordCount = DbContext.Db.Ado.GetInt("SELECT COUNT(*) FROM P_WorkOrder"); //recordCount = 0; pageCount = (int)Math.Ceiling((double)recordCount / pageSize); dataGridView1.DataSource = DbContext.Db.Queryable<P_WorkOrder>().Select(x => new { x.FactoryName, x.MfgLineName, x.WorkOrderName, x.WorkOrderNo, x.ProductionNo, x.ProductFamily, x.PlanNumber, x.OrderName, x.PlannedcompletionDate, x.PlannedstartDate, x.DoneNumber, x.WorkOrderRuleID, x.WorkOrderType, x.WorkOrderStatus, }).OrderBy(x => x.PlannedstartDate, OrderByType.Desc).ToPageList(pageStart, pageSize, ref recordCount).ToList(); //设置表头 dataGridView1.Columns["FactoryName"].HeaderText = "工厂名称"; dataGridView1.Columns["MfgLineName"].HeaderText = "产线名称"; dataGridView1.Columns["WorkOrderName"].HeaderText = "工单名称"; dataGridView1.Columns["WorkOrderNo"].HeaderText = "产品型号"; dataGridView1.Columns["ProductionNo"].HeaderText = "产品料号"; dataGridView1.Columns["ProductFamily"].HeaderText = "产品系列"; dataGridView1.Columns["PlanNumber"].HeaderText = "计划产量"; dataGridView1.Columns["OrderName"].HeaderText = "订单"; dataGridView1.Columns["PlannedcompletionDate"].HeaderText = "计划结束时间"; dataGridView1.Columns["PlannedstartDate"].HeaderText = "计划开始时间"; dataGridView1.Columns["DoneNumber"].HeaderText = "实际产量"; dataGridView1.Columns["WorkOrderRuleID"].HeaderText = "工单规则编号"; dataGridView1.Columns["WorkOrderType"].HeaderText = "工单类型"; dataGridView1.Columns["WorkOrderStatus"].HeaderText = "工单状态"; //禁止自动选中第一 dataGridView1.Rows[0].Selected = false; All_textBox.Text = recordCount.ToString(); PageAll_textBox.Text = pageCount.ToString(); Page_textBox.Text = (pageIndex + 1).ToString(); }
最新发布
08-17
<think>好的,用户想在C# WinForms的DataGridView显示行号。首先,我需要回顾一下之前提供的引用内容,看看有没有相关的方法。引用[1]和[2]都提到了使用RowPostPaint事件来绘制行号,这是一个常用的方法。用户可能已经看过这些方法,但需要更详细的步骤说明。 首先,确认用户的需求是显示行号,而不是其他功能。根据引用[1],在RowPostPaint事件中使用Graphics.DrawString来绘制行号,并调整位置。引用[2]则用了TextRenderer.DrawText,两种方法都可以,但需要注意性能差异。可能需要比较这两种方法的优缺点,帮助用户选择。 接下来,考虑是否需要处理头的大小,确保行号能够完整显示。引用[4]提到调整列宽的方法,可能头宽度也需要调整,比如设置RowHeadersWidth。 然后,想到是否有其他方法,比如在数据绑定时添加行号列。但动态添加的列可能在排序或过滤后行号不更新,所以事件绘制的方法更可靠。 还需要注意,当用户滚动或添加/删除时,行号是否正确更新。RowPostPaint事件会在每次绘制时触发,因此能自动更新。 另外,引用[3]提到了获取当前索引,可能在点击事件中显示行号,但用户的需求是始终显示,所以还是RowPostPaint更合适。 最后,整理步骤:订阅RowPostPaint事件,编写绘制代码,调整头宽度,可能处理头样式。需要确保代码示例正确,并提醒用户注意事项,比如性能影响或动态调整头大小的问题。</think>在C# WinForms中实现DataGridView行号显示,可通过以下两种主流方法实现: ### 方法一:使用RowPostPaint事件绘制行号(推荐) ```csharp private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { // 设置行号文本 string lineNumber = (e.RowIndex + 1).ToString(); // 使用系统原生文本渲染(推荐) TextRenderer.DrawText( e.Graphics, lineNumber, dataGridView1.RowHeadersDefaultCellStyle.Font, new Rectangle( e.RowBounds.Location.X + 15, // X偏移量 e.RowBounds.Location.Y + 4, // Y偏移量 dataGridView1.RowHeadersWidth - 20, e.RowBounds.Height), dataGridView1.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.Right | TextFormatFlags.VerticalCenter ); } ``` ### 方法二:动态添加行号列 ```csharp // 初始化时添加列 private void Form1_Load(object sender, EventArgs e) { dataGridView1.Columns.Add("RowNumber", "#"); dataGridView1.RowsAdded += (s, ev) => UpdateRowNumbers(); dataGridView1.RowsRemoved += (s, ev) => UpdateRowNumbers(); } // 更新行号 private void UpdateRowNumbers() { foreach (DataGridViewRow row in dataGridView1.Rows) { row.Cells["RowNumber"].Value = row.Index + 1; } } ``` ### 关键配置步骤 1. **设置头宽度**: ```csharp dataGridView1.RowHeadersWidth = 50; // 确保行号可见 ``` 2. **调整对齐方式**: ```csharp dataGridView1.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; ``` ### 性能对比 | 方法 | 优点 | 缺点 | |-------------|--------------------------|------------------------------| | 事件绘制 | 实时更新,不影响数据结构 | 需要处理绘制偏移量 | | 动态列 | 直观可见 | 排序/过滤后需手动更新行号[^3]| 建议优先选择**RowPostPaint事件方案**,其具备更好的动态响应能力且不会影响数据结构[^1][^2]。若需要导出带行号的数据,可配合动态列方案使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值