Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除datagridview中的行_C#_Datagridview - Fatal编程技术网

C# 删除datagridview中的行

C# 删除datagridview中的行,c#,datagridview,C#,Datagridview,我想单击“chkCPTData”按钮删除datagridview“CPTData”的一些行。我在datagridview中有数百行数据。第一次单击该按钮时,不会删除任何行。然后我再次单击,一些行被删除。删除所有要删除的行大约需要8次。如何仅单击一次按钮即可删除行?谢谢 private void chkCPTData_Click(object sender, EventArgs e) { for (int rows = 0; rows <= CPTData.R

我想单击“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();


    }
private void chkCPTData_单击(对象发送方,事件参数e)
{
for(int rows=0;rows(double)System.Convert.ToSingle(analysisDepth.Text))
{
CPTData.Rows.RemoveAt(行);
}
}
CPTData.Refresh();
}

在对行进行枚举时删除行将抛出索引,因此请尝试反向操作:

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);
  }
}

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

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

通常的解决方法是向后循环(从末尾开始,一直到第一行)


其他方法是实现这一点的最佳方法,但您也可以在删除时减少增量变量<代码>CPTData.Rows.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();          

}