【问题标题】:Delete row in a DataGridView C#在 DataGridView C# 中删除行
【发布时间】:2013-11-16 04:55:43
【问题描述】:

我尝试遍历我的dataGridView1 并删除不满足以下条件的行:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0)
    {
        dataGridView1.Rows.Remove(row); //error: Uncommitted new row cannot be deleted.
    }
}

但是我收到了这个错误:

无法删除未提交的新行。

如果代码也是VB.NET,我可以管理。

【问题讨论】:

  • 从数据源中删除记录比尝试从datagridview中删除要好。

标签: c# .net vb.net datagridview row


【解决方案1】:

这种情况下不要使用foreach,循环的collection可能会被修改导致无法预料的结果,有时会抛出collection被修改的异常(主要在LINQ遇到),请改用for

 for(int i = dataGridView1.RowCount-1; i >= 0; i--){
   var row = dataGridView1.Rows[i];
   if (!row.IsNewRow&&!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0){
      dataGridView1.Rows.Remove(row);
   }
 }

请注意,我们必须从最大的索引循环到 0。

【讨论】:

  • 遇到@King King的警告:使用foreach时可能会修改循环集合。很好的解决方案。
【解决方案2】:

试试

foreach (DataGridViewRow row in dataGridView1.Rows)
{
 if (!(row.Cells.OfType<DataGridViewCell>().All(c=>c.Value == null))
  {
   if (!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0)
   {
     dataGridView1.Rows.Remove(row);
   }
  }
}

【讨论】:

    【解决方案3】:

    尝试提出以下条件:

    foreach(DataGridViewRow row in dataGridView1.Rows)
                    {
    
                      if(!row.IsNewRow)
                      {
                         if (!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0)
                         {
                           dataGridView1.Rows.Remove(row);
                         }
                      }
    
                    }
    

    【讨论】:

    • 我试过你的代码,但即使满足条件,也不是所有行都被删除了。
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多