当前位置: 移动技术网 > IT编程>开发语言>c# > DataGridView控件显示行号的正确代码及分析

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
前些天在写个小程序,用到datagridview,想给它动态的显示行号。不是很费劲google了一下,这google不要紧,发现了不少问题。以下基本上都是google搜索出

前些天在写个小程序,用到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~

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网