簡體   English   中英

從C#中的數據表中刪除一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM