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

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

你可能感兴趣的:(小技巧)