在C#中从数据表中删除行

10

我在尝试从datatable中删除行时遇到了问题。我的程序是使用一个SQL查询将数据库中的信息读入到datatable中的。我使用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();

有没有人可以举个例子,提出其他方法?


没有错误。我尝试在表格中打印行数。在上面的删除方法之前和之后,它是相同的。 - Norman
请查看以下链接:https://dev59.com/eW035IYBdhLWcg3wErrM#31702529 - AliNajafZadeh
8个回答

20

尝试使用 Delete 方法:

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

不起作用。行数在之前和之后都是相同的。我有一个显示表格的数据网格视图。它保持不变。 - Norman
你的 dt.Select("Student... 是否返回结果(非空数组)? - manji
嗯...是的。但我不知道为什么。如你在dgv中看到的,列名明显是“student”。 - Norman
哇,我搞定了!显然短语“Student=' " + id + " ' ”在单引号前后有两个额外的空格! - Norman

3

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

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; - Brian

3

0

高级 for 循环 在这种情况下效果更好

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

            StudentTable.AcceptChanges();
        }

0

我认为 OP 的代码无法正常工作的原因是一旦调用了 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()方法。

此外,这里有一个关于行过滤语法的好链接。


0

我看到很多答案使用Remove方法,还有一些使用Delete方法。

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

相比之下,Delete方法将RowState更改为已删除,并在更新时更新服务器表。同样,在更新到服务器表之前调用AcceptChanges方法将重置所有RowState为Unchanged,并且不会流向服务器。(在多次尝试后,我的拇指仍在恢复中)。


0
如果您想从 DataTable 中删除整行,请尝试以下方法:
DataTable dt = new DataTable();  //User DataTable
DataRow[] rows;
rows = dt.Select("Student=' " + id + " ' ");
foreach (DataRow row in rows)
     dt.Rows.Remove(row);

-1

我不知道要删除的行的索引位置。我需要通过该行中的字符串ID进行搜索。 - Norman
你可以在 http://msdn.microsoft.com/en-us/library/b5c0xc84(VS.80).aspx 上搜索 DataTable,并删除你需要的行。 - adt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接