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~