【问题标题】:Deleting row from datatable in C#从 C# 中的数据表中删除行
【发布时间】:2011-09-17 11:13:38
【问题描述】:

我在从数据表中删除行时遇到问题。在我的程序中,我正在使用 sql 查询将数据库中的信息读取到数据表中。我使用 oledb 连接和代码 dt.Load(command.ExecuteReader()); 来执行此操作。稍后,我想删除与 id 字符串匹配的行。我尝试了以下代码,但购买无法正常工作:

            DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
            for (int i = 0; i < drr.Length; i++)
                dt.Rows.Remove(drr[i]);
            dt.AcceptChanges();

任何人都可以通过示例提出另一种方式吗?

【问题讨论】:

  • 不,没有错误。我尝试在表格中打印行数。上面delete方法前后是一样的

标签: c# datatable


【解决方案1】:

尝试使用Delete方法:

    DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
    for (int i = 0; i < drr.Length; i++)
        drr[i].Delete();
    dt.AcceptChanges();

【讨论】:

  • 不起作用。之前和之后的行数再次相同。我有一个显示表格的数据网格视图。它保持不变
  • 您的dt.Select("Student... 是否返回结果(非空数组)?
  • 嗯……是的。我不知道为什么。如 dgv 所示,列名显然是学生
  • 哇,我明白了!显然 "Student=' " + id + " ' " 这句话在单引号前后有两个额外的空格!
【解决方案2】:

有几种不同的方法可以做到这一点。但是您可以使用以下方法:

List<DataRow> RowsToDelete = new List<DataRow>();

for (int i = 0; i < drr.Length; i++) 
{     
   if(condition to delete the row) 
   {  
       RowsToDelete.Add(drr[i]);     
   } 
}

foreach(var dr in RowsToDelete) 
{     
   drr.Rows.Remove(dr); 
} 

【讨论】:

  • 你好兄弟,你是如何初始化 RowsToDelete 的?在这里吗? DataRow[] RowsToDelete=null;
【解决方案3】:

这个问题将让您深入了解如何从 DataTable 中删除记录:

DataTable, How to conditionally delete rows

看起来像这样:

DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
foreach (var row in drr)
   row.Delete();

不要忘记,如果要更新数据库,则需要调用 Update 命令。有关这方面的更多信息,请参阅此链接:

http://www.codeguru.com/forum/showthread.php?t=471027

【讨论】:

    【解决方案4】:

    我认为 OPs 代码不起作用的原因是,一旦您调用 Remove,您正在更改 drr 的长度。当您调用 Delete 时,您实际上并没有删除行,直到调用 AcceptChanges。这就是为什么如果你想使用 Remove 需要一个单独的循环。

    视情况或偏好而定...

    string colName = "colName";
    string comparisonValue = (whatever it is).ToString();
    string strFilter = (dtbl.Columns[colName].DataType == typeof(string)) ? "[" + colName + "]='" + comparisonValue + "'" : "[" + colName + "]=" + comparisonValue;
    string strSort = "";
    
    DataRow[] drows = dtbl.Select(strFilter, strSort, DataViewRowState.CurrentRows);
    

    以上用于接下来的两个示例

    foreach(DataRow drow in drows)
    {
       drow.Delete();//Mark a row for deletion.
    }
    dtbl.AcceptChanges();
    

    foreach(DataRow drow in drows)
    {
       dtbl.Rows[dtbl.Rows.IndexOf(drow)].Delete();//Mark a row for deletion.
    }
    dtbl.AcceptChanges();
    

    List<DataRow> listRowsToDelete = new List<DataRow>();
    
    foreach(DataRow drow in dtbl.Rows)
    {
       if(condition to delete)
       {
          listRowsToDelete.Add(drow);
       }
    }
    
    foreach(DataRow drowToDelete in listRowsToDelete)
    {
       dtbl.Rows.Remove(drowToDelete);// Calling Remove is the same as calling Delete and then calling AcceptChanges
    }
    

    请注意,如果调用 Delete(),则应调用 AcceptChanges(),但如果调用 Remove(),则不需要 AcceptChanges()。

    Also, here is a good link on row filter syntax.

    【讨论】:

      【解决方案5】:

      我看到许多使用 Remove 方法的答案和其他使用 Delete 方法的答案。

      删除(根据文档)将立即从(本地)表中删除记录,并且在更新时,不会删除丢失的记录。

      相比之下,删除将 RowState 更改为已删除,并将在更新时更新服务器表。同样,在更新到服务器表之前调用 AcceptChanges 方法会将您的所有 RowState(s) 重置为未更改,并且不会有任何内容流向服务器。 (打了几次之后,我的拇指还在护理)。

      【讨论】:

        【解决方案6】:

        如果您想从 DataTable 中删除整行

        试试这个

        DataTable dt = new DataTable();  //User DataTable
        DataRow[] rows;
        rows = dt.Select("Student=' " + id + " ' ");
        foreach (DataRow row in rows)
             dt.Rows.Remove(row);
        

        【讨论】:

          【解决方案7】:

          Advance for loop 更适合这种情况

          public void deleteRow(DataRow selectedRow)
                  {
                      foreach (DataRow  in StudentTable.Rows)
                      {
                          if (SR[TableColumn.StudentID.ToString()].ToString() == StudentIndex)
                              SR.Delete();
                      }
          
                      StudentTable.AcceptChanges();
                  }
          

          【讨论】:

            【解决方案8】:

            一个简单的例子:http://www.dotnetspark.com/tutorial/13-42-delete-row-from-datatable.aspx

            这对你有用吗?

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-10
            • 2018-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多