1

新しい行を追加しようとしている DataTable dt2 があります (以下のコードの else ブロック内)。foreach ループ内に単純に行を追加することはできません (行で試しましたdt2.Rows.Add(newRow);)。これは、ループ カウンターまたは何かを台無しにし、次のエラーが発生するためです。「コレクションが変更されました。列挙操作が実行されない可能性があります。」

そこで、新しい行の値をリストに格納してから、リストをループ外のテーブルに追加しようとしました。これは、コンパイルして何かを追加するという意味で機能します。残念ながら、正しい値または列の場所を取得しませんが、代わりに次のがらくたを表示します: System.Collections.Generic.List`1[System.Object]

ここに画像の説明を入力

また、この情報は、Baseline_Folder の下ではなく、Target_Folder、Target_File、および Target_Checksum の下の 3 番目、4 番目、および 5 番目のインデックス列に表示される必要があります。

正しい列の下に正しい値を保存して表示するにはどうすればよいですか?

foreach (DataRow drow in dt2.Rows)
{
    if (drow["BASELINE_FILE"].ToString() == filename)
    {
        // do stuff
    }
    else
    {
        newRow = dt2.NewRow(); // newRow is a DataRow I declared up above
        newRow[3] = directory;
        newRow[4] = filename;
        newRow[5] = checksumList[j];
        newRow[6] = "Missing";
        //dt2.Rows.Add(newRow); 
        // can't add here because that increases the number of rows and screws up the foreach loop
        // therefore need to find way to store these values and add outside of loop
        newFiles.Add(newRow); // newFiles is a List
    }
}
dt2.Rows.Add(newFiles); // this doesn't work properly, doesn't take correct values
4

3 に答える 3

0

既存のグリッドの各行を調べたい場合は、これでうまくいくはずです。このように、currentRowsは、そのリストの浅いコピーになるため、ループの実行中に変更されません。

var currentRows = from row in dataTable.Rows select row;
foreach (var row in currentRows)
{
    if(doStuffCondition){ doStuff();}
    else{
      DataRow newRow = dataTable.NewRow();
      newRow[1] = newValue;  //repeat until values are loaded
      employeesDataTable.Rows.Add(newRow);
    }
 }
于 2013-03-01T20:53:49.927 に答える
0

これがあなたが本当にやりたいことだと思います:

DataRow[] drx = dt2.Select(string.Format("BASELINE_FILE = '{0}'" , filename));

if (drx.Length == 1)
 {
    // do stuff with drx[0]

 }
 else
 {
    newRow = dt2.NewRow(); // newRow is a DataRow I declared up above
    newRow[3] = directory;
    newRow[4] = filename;
    newRow[5] = checksumList[j];
    newRow[6] = "Missing";
    dt2.Rows.Add(newRow); 
 }

この方法では、行をループする必要はありません。

于 2013-03-01T20:45:24.590 に答える
0

これは私の頭の中ではありませんが、これらの行に沿った何かが機能するはずです:

DataRow dr = dt2.NewRow();
foreach (ListItem item in newFiles.Items)
{
dr[3] = item[3].ToString();
dr[4] = item[4].ToString();
etc.
}

さらに詳しいガイダンスが必要な場合はお知らせください。詳しく調べます。

于 2013-03-01T20:40:26.737 に答える