我正在搜索PDF文件中的关键字并返回找到该关键字的网页。如果关键字IS FOUND,我将返回一个页面列表和fileName。但是,如果PDF文件中的关键字未找到,我想删除数据表中的行。
public DataTable dtPubSearchResultsFromFiles(string sqlQuery, string safeKeyword)
{
// Returns a datatable of publication search results based on PDF files.
SqlConnection con = new SqlConnection(getConnectionString());
SqlCommand cmd = new SqlCommand(sqlQuery, con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
dt.Columns.Add("Pages", typeof(string));
da.Fill(dt);
dt.PrimaryKey = new DataColumn[] { dt.Columns["publicationID"] };
foreach (DataRow row in dt.Rows)
{
//call search function to look for keyword
List<int> myPages = new List<int>();
string fileName = row["linkToPublicationPDF"].ToString();
myPages = ReadPdfFile(fileName, safeKeyword);
if (myPages.Count > 0)
{
string pagelist = "";
foreach (int page in myPages)
{
pagelist = pagelist + page + " ";
}
row["Pages"] = pagelist;
}
else
{
//remove/delete the row from the datatable if "myPages.Count" is 0
dt.Rows.Remove(row);
}
}
return dt;
}
当我添加它(“dt.Rows.Remove(row)”)时,我在页面被调用时遇到此错误“System.InvalidOperationException:Collection被修改;枚举操作可能无法执行。”
连连呢?评论?修复?欢迎所有人......
鲍勃
答案 0 :(得分:4)
您的代码从数据库中获取某些数据,以便您的程序可以使用它。
您获得的例外情况是因为您正在修改(通过删除元素)您正在迭代的集合并且无法实现这一点。
您可以通过创建存储要删除的行的临时var toRemove = new List<DataRow>();
foreach (DataRow row in dt.Rows)
{
//call search function to look for keyword
List<int> myPages = new List<int>();
string fileName = row["linkToPublicationPDF"].ToString();
myPages = ReadPdfFile(fileName, safeKeyword);
if (myPages.Count > 0)
{
string pagelist = "";
foreach (int page in myPages)
{
pagelist = pagelist + page + " ";
}
row["Pages"] = pagelist;
}
else
{
//remove/delete the row from the datatable if "myPages.Count" is 0
toRemove.Add(row);
}
}
}
foreach (DataRow row toRemove.Add)
{
dt.Rows.Remove(row);
}
来解决此问题。完成迭代后,您可以迭代临时列表并删除您不再需要的内容。
{{1}}
答案 1 :(得分:0)
尝试简单的删除
row.Delete();
然后循环
dt.AcceptChanges();
但它可能会失败 看马里奥的回答 它可能有效,如果它只是标记行删除