∗多行删除刷新后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]);
}