DataGridView控件显示行号的正确代码及分析

时间:2022-07-26 22:05:50 

前些天在写个小程序,用到DataGridView,想给它动态的显示行号。不是很费劲GOOGLE了一下,这GOOGLE不要紧,发现了不少问题。以下基本上都是GOOGLE搜索出来的网上的一些解决方法,千篇一律都是这样的:


private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

            for (int i = 0; i < e.RowCount; i++)
            {
                this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();
            }
            for (int i = e.RowIndex + e.RowCount; i < this.dgvKBRollUp.Rows.Count; i++)
            {
                this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                this.dgvKBRollUp.Rows[i].HeaderCell.Value = (i + 1).ToString();
            }            
        }

private void DataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {

            for (int i = 0; i < e.RowCount; i++)
            {
                this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();
            }
            for (int i = e.RowIndex + e.RowCount; i < this.dgvKBRollUp.Rows.Count; i++)
            {
                this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                this.dgvKBRollUp.Rows[i].HeaderCell.Value = (i + 1).ToString();
            }            
        }


只要用过这段代码的人就应该发现这段代码是运行出错的。原因就出在RowsRemoved事件里,会抛出一个Index outof range的异常。然而就是这么一段有错的代码,几乎充斥着整个互联网,千篇一律的COPY,没有一个人纠正。

先说下这段代码出错的原因吧:
在RowsRemoved事件里,最开始生成DataGridView的数据的时候,也是会触发这个事件的。这个时候DataGridView控件的Rows.Count就是0。那下面这行代码就有问题了:


this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;


e.RowIndex + i,这里对应的是Rows[0],但是Rows.Count还是0啊,Rows[0]是不存在的。要存在Rows[0]起码DataGridView控件要有一行才行。为了避免这个错误,小小的修改代码就行了:


private void dgvKBRollUp_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            if (dgvKBRollUp.Rows.Count != 0)
            {
                for (int i = 0; i < e.RowCount; i++)
                {
                    this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                    this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();
                }

                for (int i = e.RowIndex + e.RowCount; i < this.dgvKBRollUp.Rows.Count; i++)
                {
                    this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                    this.dgvKBRollUp.Rows[i].HeaderCell.Value = (i + 1).ToString();
                }

            }


只要加上一个对Rows.Count的判断就可以避免这个错误。希望网上的一些COPY的朋友也要注意了,以后COPY过来的时候,自己还是要动手验证一下。将一个错误的信息胡乱的传播是对一些新手以及自己都不怎么好的。

最后附上微软MSDN里面关于e.RowIndex和e.RowCount的一段代码:


System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder();
            messageBoxCS.AppendFormat("{0} = {1}", "RowIndex", e.RowIndex);
            messageBoxCS.AppendLine();
            messageBoxCS.AppendFormat("{0} = {1}", "RowCount", e.RowCount);
            messageBoxCS.AppendLine();
            MessageBox.Show(messageBoxCS.ToString(), "RowsRemoved Event");


通过这段代码你可以很轻松地跟踪事件参数里的e.RowIndex和e.RowCount的值。当然你可以DEBUG,一样的。我就是DEBUG的O(∩_∩)O~

标签:datagridview控件
0
投稿

猜你喜欢

  • @GrpcServise 注解的作用和使用示例详解

    2021-07-25 21:12:25
  • Android SwipeRefreshLayout超详细讲解

    2023-08-22 13:43:28
  • C# Memcached缓存用法实例详解

    2023-06-29 07:27:33
  • 详解SpringMVC的url-pattern配置及原理剖析

    2023-08-11 12:00:27
  • C#实现语音视频录制-附demo源码

    2023-10-04 13:22:03
  • IDEA使用SpringAssistant插件创建SpringCloud项目

    2021-06-06 10:47:46
  • Java同步锁Synchronized底层源码和原理剖析(推荐)

    2023-09-25 08:36:22
  • 详解Maven多模块打包遇到的问题解决方法

    2022-12-25 13:01:12
  • 详解Java数据库连接JDBC基础知识(操作数据库:增删改查)

    2023-08-22 23:47:37
  • IntelliJ IDEA中显示和关闭工具栏与目录栏的方法

    2023-09-01 23:18:59
  • 详细分析Java中String、StringBuffer、StringBuilder类的性能

    2023-05-03 05:22:41
  • c#遍历System.drawing.Color下面的所有颜色以及名称以查看

    2022-05-12 06:33:19
  • java的Builder原理和实现详解

    2023-09-11 22:46:01
  • Android编程将Activity背景设置为墙纸的简单实现方法

    2022-01-13 14:27:42
  • 如何在MyBatis中实现DataSource

    2021-11-29 13:49:48
  • SpringBoot中Jackson日期格式化技巧分享

    2022-05-21 01:40:24
  • Java实现提取QSV文件视频内容

    2023-08-24 13:33:45
  • SpringMVC数据响应详细介绍

    2023-09-24 04:12:41
  • Java中ArrayList和SubList的坑面试题

    2023-09-21 06:56:21
  • mybatis的插件机制示例详解

    2023-02-24 23:46:17
  • asp之家 软件编程 m.aspxhome.com