您的位置:首页 > 其它

多行删除刷新后Index为空的问题

2015-11-17 16:23 204 查看
∗多行删除刷新后Index为空的问题∗

前言

原有方法是执行单行删除后的同步刷新操作,如今要将单行删除改为支持多行删除操作,多行删除的语句已经写好。但是多行刷新遇见问题,总是提示“Index不存在或者为空”之类的问题,仔细分析了一下刷新方法后知道了问题的所在了:

问题主要出现在刷新删除的这个循环中:

//单行删除完成后从列表中清除已经删除的行
public void RefreshGridViewForDelete(bool delResult)
{
if (delResult == false)
{
return;
}
if (dgvResult.SelectedRows != null && dgvResult.SelectedRows.Count > 0)
{
List<int> selRowsIndex = new List<int>();
for (int i = 0; i < dgvResult.Rows.Count; i++)
{
if (dgvResult.Rows[i].Selected == true)
{
selRowsIndex.Add(i);
}
}
for (int j = 0; j < selRowsIndex.Count; j++)
{
dgvResult.Rows.RemoveAt(selRowsIndex[j]);
}
}
SeachConditionCtl.ExeuteQuery();
}


这种方式在单行删除中一点问题都没有,因为selRowsIndex.Count始终未1。

但是如果是多行删除,那么就有问题了,因为selRowsIndex.Count肯定大于等于1,如果大于1,那么当j=0的那一行清除后,循环到下一行时,行号已经变化,循环找到selRowsIndex[j]已经不是正常情况下应该清除的那一行了,所以报错Index找不到。

那么我们如何解决呢,其实也好办,因为主要是执行清除行的时候,原始方法是从0开始也就是从前往后清除的,那么只要前面一行删除了,必定会影响后面所有行的行号排列。我们只需要将方法改变为从后往前清除,这样删除会从最后一列开始清除而不影响前面的行号。具体改动如下:

//适应多行删除,for循环从尾部开始,
for (int j = 1; j <= selRowsIndex.Count; j++)
{
int k = selRowsIndex.Count - j;//转化为已选择列的尾列序号
dgvResult.Rows.RemoveAt(selRowsIndex[k]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: