首页 文章

从DataTable中删除行

提问于
浏览
1

我需要从列具有特定值的DataTable dt中删除行 . 在删除它们之前,我将它们复制到另一个DataTable dt2nd .

看起来像这样

for (int i = dt.Rows.Count - 1; i >= 0; i--)
        {
            DataRow row = dt.Rows[i];

            if (row["Column2"].ToString() == "This Value")
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
            }
            if (row["Column2"].ToString() == "Other Value")
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
            }
            //This continues with more if
        }

但是我收到一条错误消息

“附加信息:此行已从表中删除,并且没有任何数据.BeginEdit()将允许在此行中创建新数据 . ”

很多行可以具有“此值”或“其他值” .

==“”值可以是很多不同的值,所以如果我这样做,那将是很多IF语句 .

有没有什么好方法可以用LINQ或其他方式做到这一点?

3 回答

  • 1

    你可以尝试这个......

    var checkValues = new string[]  { "Some value1", "Some value3" };
            DataTable dt = new DataTable();
            DataTable dt1 = new DataTable();
            dt.Columns.Add("Column1");
            dt.Columns.Add("Column2");
            dt.Columns.Add("Column3");
            dt.Rows.Add(new string[] {"Some value1", "Some value2", "Some value3" });
            dt.AsEnumerable().ToList().ForEach(x =>
                {
                    if (checkValues.Contains(x["Column1"]))
                    {
                        dt1.ImportRow(x);
                        dt.Rows.Remove(x);
                    }
                });
    
  • 1

    此代码将起作用:

    for (int i = dt.Rows.Count - 1; i >= 0; i--)
        {
            DataRow row = dt.Rows[i];
    
            if (row["Column2"].ToString() == "This Value")
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
                continue;
            }
            if (row["Column2"].ToString() == "Other Value")
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
                continue; 
            }
            //This continues with more if
        }
    

    或者您可以使用switch语句而不是所有ifs或使用else if

    for (int i = dt.Rows.Count - 1; i >= 0; i--)
        {
            DataRow row = dt.Rows[i];
    
            if (row["Column2"].ToString() == "This Value")
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
            }
            else if (row["Column2"].ToString() == "Other Value")
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
            }
            //This continues with more else if
        }
    

    要么

    for (int i = dt.Rows.Count - 1; i >= 0; i--)
        {
            DataRow row = dt.Rows[i];
    
            switch(row["Column2"].ToString()){
            case "This Value":
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
                break;
            }
            case "Other Value":
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
                break; 
            }
            //This continues with more case
        }
    

    但是,您也可以在数据表上使用select,并输出需要移出的所有行 . 这样的事情:

    dt.select("Column2 == 'This value' or ...");
    

    它将返回满足条件的行 . 请参见此处的示例:http://www.dotnetperls.com/datatable-select

    但是如果操作总是相同的话,代码可以缩短很多:

    for (int i = dt.Rows.Count - 1; i >= 0; i--)
        {
            DataRow row = dt.Rows[i];
    
            if (
                   (row["Column2"].ToString() == "This Value") ||
                   (row["Column2"].ToString() == "Other Value") //more checks
               )
            {
                dt2nd.ImportRow(row); //Copy
                dt.Rows.Remove(row); //Remove
            }
        }
    

    要么

    for (int i = dt.Rows.Count - 1; i >= 0; i--)
    {
        DataRow row = dt.Rows[i];
    
        switch(row["Column2"].ToString()){
        case "This Value":
        case "Other Value": //more case values
        {
            dt2nd.ImportRow(row); //Copy
            dt.Rows.Remove(row); //Remove
            break;
        }
    }
    
  • 1
    var valuesToBeChecked = new String[] { "value1", "value2" };
            var x = from y in dt.AsEnumerable()
                    where valuesToBeChecked.Any(t => valuesToBeChecked.Contains(y["Column2"].ToString()))
                    select y;
            var z = dt.AsEnumerable().Except(x);
    

    然后,您可以将 z 复制到您想要的 datatable

    DataTable dt2 = z.CopyToDataTable();
    

相关问题