【问题标题】:How to find rows in tbl1 that are not in tbl2 and delete them如何在 tbl1 中查找不在 tbl2 中的行并删除它们
【发布时间】:2014-09-28 21:24:17
【问题描述】:

我是 VS C# 的初学者,正在处理我继承的 WINFORM 项目。 我需要在 tbl1 中找到 tbl2 中不存在的行并将其删除。加入列将是: tbl1==> "VistaFieldName" tbl2==> "FMFieldName"

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

已编辑:尝试了链接中的查询语法,它有效,但现在我遇到了异常。如果我在第一个 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();

【问题讨论】:

  • LINQ is 语法,您可以在 Windows 窗体应用程序中使用。你在尝试这个时遇到了什么问题?
  • 有什么理由选择 LINQ?除此之外使用起来很酷(哈哈)?
  • 约翰,我发现了一个问题。我放了一个;在第一行的末尾,它不喜欢那样。删除之后,每个 Trim() 都说错误 1“对象”不包含“修剪”的定义,并且找不到接受“对象”类型的第一个参数的扩展方法“修剪”(您是否缺少使用指令还是程序集引用?)
  • coe4life,并不是我选择了它,而是寻找解决方案来做一些我不知道如何做的事情。
  • 我在 .Trim() 之前添加了 ToString() 并清除了错误。我看看有没有。

标签: c# winforms


【解决方案1】:

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

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

 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多