欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-16 12:59:46
前些天在写个小程序,用到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~