我是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();
答案 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();