2016-06-21 5 views
0

PDFファイルでキーワードを検索し、そのキーワードが見つかったページを返します。キーワードが見つかった場合は、ページのリストとfileNameを返します。ただし、キーワードがPDFファイルでNOT FOUNDだった場合は、データテーブルの行を削除します。C#でデータテーブルから行を削除する

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(行)」)、私はページが呼び出され、このエラーが出る「と、System.InvalidOperationException:コレクションが変更された。列挙操作は実行されない場合がありますが」

提案?コメント?修正?すべてが

答えて

4

あなたのコードはです。データベースからデータを取得することで、プログラムが使用できるようになります。

例外は、反復処理中のコレクションを(要素を削除して)変更しているためであり、これは不可能です。

一時的な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); 
} 
+0

ありがとうMarios。それは私の問題の最初の部分を解決したようです。 –

0

がしよう...

ボブ歓迎されている簡単な削除

row.Delete(); 

は、ループ後

dt.AcceptChanges(); 

は、それはおそらく
はマリオ
からの回答を参照してくださいに失敗します実際に削除行をマークするだけであれば動作する可能性があります

関連する問題