2013-03-01 3 views
1

У меня есть DataTable, dt2, где я пытаюсь добавить новые строки (в блок else кода ниже). Я не могу просто добавить строки в цикле foreach (который я пробовал с помощью строки dt2.Rows.Add(newRow);), потому что это затягивает счетчик циклов или что-то еще и вызывает следующую ошибку: «Коллекция была изменена, операция перечисления может не выполняться».Как добавить новые строки в DataTable только в определенных столбцах?

Поэтому я попытался сохранить новые значения строк в списке и затем добавить список в таблицу за пределами цикла. Это работает в том смысле, что оно компилируется, и оно что-то добавляет; к сожалению, он не принимает правильные значения или местоположения столбцов, но вместо этого показывает эту хрень: System.Collections.Generic.List`1 [System.Object]

enter image description here

Кроме того, информация должна отображаться в 3-м, 4-м и 5-м столбцах индекса под Target_Folder, Target_File и Target_Checksum, а не под 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

i m сталкивается с такой же проблемой, может ли любой орган дать решение благодаря –

ответ

0

Это от верхней части моей головы, но что-то вдоль этих линий должно работать:

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

Если вам нужно больше указаний, дайте мне знать, и я буду смотреть на него сложнее.

+0

, где я добавляю это? после цикла foreach? – user1985189

+0

newFiles определяется вне цикла, не так ли? Если это так, вы можете сделать это после цикла. – Melanie

+0

говорится, что DataRow dr = new DataRow(); недоступен из-за его уровня защиты и бросает ошибку компиляции – user1985189

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); 
} 

Таким образом, вам не нужно Переберите строк.

+0

, что это делает? Вы можете объяснить эту первую строку? – user1985189

+0

@ user1985189 функция select проверяет строки на определенное условие и возвращает набор строк. он работает как sql select. – AbZy

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); 
    } 
} 
Смежные вопросы