[英]Deleting a row from a datatable in C#
我正在搜索PDF文件中的關鍵字,並返回找到該關鍵字的頁面。 如果找到了關鍵字,則返回頁面列表和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:集合已修改;枚舉操作可能無法執行”時,出現此錯誤。
建議? 評論? 修復? 都歡迎...
短發
您的代碼正在從數據庫中獲取一些數據,以便您的程序可以使用它。
您得到的異常是因為您正在修改(通過刪除元素)要迭代的集合,而這是不可能的。
您可以通過創建一個臨時List
來解決此問題,在該List
中存儲要刪除的行。 迭代完成后,您可以在臨時列表上進行迭代,並刪除您決定不再使用的內容。
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);
}
嘗試一個簡單的刪除
row.Delete();
然后在循環之后
dt.AcceptChanges();
但它可能會失敗
見馬里奧的答案
如果它實際上只是標記要刪除的行,則可能會起作用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.