我想点击“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();
}
答案 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();
}