删除datagridview中的行

时间:2014-02-07 20:43:03

标签: c# datagridview

我想点击“chkCPTData”按钮删除datagridview“CPTData”的某些行。我在datagridview中有数百行数据。我第一次单击该按钮时,不会删除任何行。然后我点击另一次,删除了一些行。删除我要删除的所有行大约需要8次。如何只通过单击按钮一次删除行?谢谢!

  private void chkCPTData_Click(object sender, EventArgs e)
    {


        for (int rows = 0; rows <= CPTData.Rows.Count - 2; rows++)
        {
            double SampleDepth =(double)System.Convert.ToSingle(CPTData.Rows[rows].Cells[0].Value);
            if (SampleDepth > (double)System.Convert.ToSingle(analysisDepth.Text))
            {
                CPTData.Rows.RemoveAt(rows);
            }
        }

       CPTData.Refresh();


    }

2 个答案:

答案 0 :(得分:1)

在枚举通过它们时删除行会抛弃索引,所以请尝试反过来:

for (int rows = CPTData.Rows.Count - 2; rows >=0; --rows)
{
  double SampleDepth =(double)System.Convert.ToSingle(CPTData.Rows[rows].Cells[0].Value);
  if (SampleDepth > (double)System.Convert.ToSingle(analysisDepth.Text))
  {
    CPTData.Rows.RemoveAt(rows);
  }
}

答案 1 :(得分:1)

问题是由前向循环引起的。这样,当您删除一行时,索引rows不再指向下一行,而是指向下一行之后的行。

例如,你在rows=10并且你需要删除它,之后,rows在循环中递增到11但是此时Rows数组的偏移量11被占用通过删除前偏移量为12的行。实际上,您在每次RemoveAt后都会在支票中跳过一行。

解决它的常用方法是向后循环(从结束开始并向第一行开始)

private void chkCPTData_Click(object sender, EventArgs e)
{
    for (int rows = CPTData.Rows.Count - 1; rows >=0; rows--)
    {
        double SampleDepth =(double)System.Convert.ToSingle(CPTData.Rows[rows].Cells[0].Value);
        if (SampleDepth > (double)System.Convert.ToSingle(analysisDepth.Text))
        {
            CPTData.Rows.RemoveAt(rows);
        }
    }
    CPTData.Refresh();          

}