我有一个DataTable,dt2,我正在尝试添加新行(在下面代码的else块中)。我不能简单地在foreach循环中添加行(我尝试使用行dt2.Rows.Add(newRow);
),因为这会使循环计数器或其他东西搞砸并导致以下错误:“集合已被修改;枚举操作可能不会执行“。
所以我尝试将新行值存储在List中,然后将List添加到循环外的表中。这在它编译的意义上起作用,它确实增加了一些东西;不幸的是,它没有采用正确的值或列位置,而是显示此废话: System.Collections.Generic.List`1 [System.Object]
此外,信息应显示在Target_Folder,Target_File和Target_Checksum下的第3,第4和第5个索引列中,而不是在Baseline_Folder下。
如何在正确的列下存储和显示正确的值?
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
答案 0 :(得分:0)
这不是我的首要问题,但这些内容应该有效:
DataRow dr = dt2.NewRow();
foreach (ListItem item in newFiles.Items)
{
dr[3] = item[3].ToString();
dr[4] = item[4].ToString();
etc.
}
如果您需要更多指导,请告诉我,我会更加努力。
答案 1 :(得分: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);
}
这样您就不需要遍历行了。
答案 2 :(得分: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);
}
}