如何在tbl1中查找不在tbl2中的行并删除它们

时间:2014-09-28 21:24:17

标签: c# winforms

我是VS C#的初学者,正在研究我继承的WINFORM项目。 我需要在tbl1中找到tbl2中不存在的行并删除它们。加入列将是: TBL1 ==> “VistaFieldName” TBL2 ==> “FMFieldName”

我在StackOverflow链接Get what exists in one DataTable but not another using LINQ中发现了一些我认为可能有用的代码,但是它使用的是linq而且我不熟悉linq。

EDITED:尝试了链接中的查询语法并且它有效,但现在我得到了一个例外。如果我接受第一个foreach循环中的更改,我会得到'集合修改',如果我将接受更改放在foreach循环之外,我会得到一个异常'无法访问标记为删除的行'

我该怎么做才能防止这种情况发生?

else if (dsVX130.Tables["tAttributes"].Rows.Count > 0)
                    {
                        var rowsOnlyIntblsAttributes = from r in tblsAttributes.AsEnumerable() //was dt1
                        //make sure there aren't any matching names in dt2
                        where !tbltAttributes.AsEnumerable().Any(r2 => r["VistaFieldNumber"].ToString().Trim().ToLower() == r2["FMFieldNumber"].ToString().Trim().ToLower())
                        select r;

                        DataTable result = rowsOnlyIntblsAttributes.CopyToDataTable();

                        //result.Rows[0]["VistaFieldNumber"]
                        string vresult;
                        foreach (DataRow dr in result.Rows)
                        {
                         vresult=result.Rows[0]["VistaFieldNumber"].ToString();
                            foreach (DataRow dr1 in tblsAttributes.Rows)
                            {
                                if (dr1["VistaFieldNumber"].ToString() == vresult)
                              {
                                dr1.Delete();
                                tblsAttributes.AcceptChanges();
                              }
                            }
                        }
                        tblsAttributes.AcceptChanges();
                        applyAttributes();

1 个答案:

答案 0 :(得分:0)

已解决:我使用Get what exists in one DataTable but not another using LINQ中的查询语法示例来查找tbl1中不在tbl2中的行,然后发出删除行。起初我使用FOREACH但发现你无法枚举表并同时删除行。这是通过将FOREACH替换为FOR来解决的,如此处所示。

在测试最终结果时,我发现我需要测试查询结果中返回的行,否则我在发布copytable时收到异常。我使用的测试是

 else if (dsVX130.Tables["tAttributes"].Rows.Count > 0)
                    {
                        var rowsOnlyIntblsAttributes = from r in tblsAttributes.AsEnumerable() //was dt1
                        //make sure there aren't any matching names in dt2
                        where !tbltAttributes.AsEnumerable().Any(r2 => r["VistaFieldNumber"].ToString().Trim().ToLower() == r2["FMFieldNumber"].ToString().Trim().ToLower())
                        select r;

                        if (rowsOnlyIntblsAttributes.Any())
                        { 
                            DataTable result = rowsOnlyIntblsAttributes.CopyToDataTable();

                        //result.Rows[0]["VistaFieldNumber"]
                        string vresult;
                        for (int i = 0; i < result.Rows.Count; i++)

                        //foreach (DataRow dr in result.Rows)
                        {
                            //var tempRow = result.Rows[i];
                            //var temp = result.Rows[i][0];
                            vresult=result.Rows[i]["VistaFieldNumber"].ToString();
                         for (int j = 0; j < tblsAttributes.Rows.Count; j++)
                            //foreach (DataRow dr1 in tblsAttributes.Rows)
                            {
                                DataRow dr1 = tblsAttributes.Rows[j];
                                if (dr1["VistaFieldNumber"].ToString() == vresult)
                              {
                                dr1.Delete();
                                tblsAttributes.AcceptChanges();
                                break;
                              }
                                //tblsAttributes.AcceptChanges();
                            }
                        }
                    }
                        //tblsAttributes.AcceptChanges();
                        applyAttributes();