#asp.net #vb.net #datarow
#asp.net #vb.net #поток данных
Вопрос:
Я сталкиваюсь с ошибкой при циклическом просмотре потоков данных. Я искал SO и пробовал решения, но безуспешно.
Коллекция была изменена; операция перечисления может не выполняться.
Dim dRow As DataRow
For Each dRow In dt.Rows
dt.Rows.Add(dRow("CustNum"), dRow("SalesRepName"), dRow("mgrid"), "=""" amp; dRow("midValue") amp; """", dRow("dba"), dRow("sysDate"), dRow("statusID"))
Next
Ошибка возникает при первом попадании кода в « Next
«
То, что могло бы вызвать сбор, было изменено; операция перечисления может не выполняться.Как я могу устранить эту ошибку?
Ответ №1:
Вы не можете перечислять коллекцию при ее обновлении. Даже если бы этот код действительно работал, он выполнялся бы вечно, потому что вы продолжаете добавлять все больше и больше строк, и он будет продолжать их перечислять.
Вы можете немного изменить свой подход и заставить это работать, используя цикл for со счетчиком индексов и фиксированной верхней границей.
Что-то вроде этого должно работать:
Dim rowCount As Integer = dt.Rows.Count ' Set upper bound = original row count
Dim index as Integer
For index = 0 To rowCount - 1 ' Iterate through the original set of rows
Dim dRow as DataRow = dt.Rows.Item(index) ' Get row by index
dt.Rows.Add(dRow("CustNum"), dRow("SalesRepName"), dRow("mgrid"), "=""" amp; dRow("midValue") amp; """", dRow("dba"), dRow("sysDate"), dRow("statusID"))
Next index
Ответ №2:
Вы добавляете элементы в коллекцию, которую вы перечисляете. Логически, цикл будет бесконечным. Такая ситуация не может возникнуть. Если вы действительно хотите это сделать, разделите его на две части, создав Structure
или Class
для ваших данных, добавив элементы в список, затем пройдитесь по списку и добавьте элементы в таблицу.