最近在写一个窗体应用,要求有datagridview的显示,以及增删改查。
所以需要有遍历,一般的遍历跟普通的table类似,主要是一进行删除,问题就出现了。
在遍历循环里,datagridview.Rows.Count和表格行Row[n]是会即时更新的,也就是说删一行,少一行,这时候遍历的指向就会有问题,例如:删除了第一个,第二行就变成了第一行,但此时遍历的指向已经是变成第二行了,结果就是删除永远会漏一行。
因此根据网友的推荐,使用while循环
while(datagridview .Rows .Count !=0)
{
datagridview .Rows .RemoveAt (0);
}///清空显示表单
这样就不用管遍历的指向了,反正第一行删除之后,下面的就会成为第一行,那我们就只管一直删除第一行就OK了。
如果在datagridview中加上了CheckCloumn的检查,例如勾选的会删除,没有勾选的不会删除,那就不能像上面那样一直删除第一行了,所以只能在遍历的指向遍历n中寻找方法。
在进行勾选检查的时候,我们可以在遍历到有勾选的行时,让n不变,这样在删除之后,也能执行下面的数据行了,但for循环中n是不断增加的,那怎么让n保持不变呢?
很简单,让n-1就行了。
for (int n = 0; n < datagridview.RowCount; n++)
{
if (Convert.ToBoolean(datagridview.Rows[n].Cells[0].Value) == true)
{
datagridview.Rows.RemoveAt(n);
n--;
}
}
值得注意的是,此时for循环中的循环条件必须是datagridview.RowCount。毕竟让n实时变化,那总数Count也要实时变化才行。