удалить строки из датасет

gulyaev.s
Дата: 25.01.2010 19:40:28
   
   Dim row1 As DataRow
            For Each row1 In copyDataSet.Tables(1).Rows

                If row1(0) <> "046" Then


                    row1.Delete()

                    copyDataSet.Tables(1).AcceptChanges()
                End If

            Next

скопировал датасет в copyDataSet

теперь хочу удалить из таблиц все что не равно 046 ,то есть нужные строки , пишет ошибку :
Коллекция изменена, возможно операция перечисления не будет выполнена.
Ora Starter
Дата: 25.01.2010 21:01:27
gulyaev.s,

это?
gulyaev.s
Дата: 25.01.2010 23:16:11
Ora Starter,
ошибку пишет
Коллекция изменена, возможно операция перечисления не будет выполнена.


        For Each dr2 As DataRow In copyDataSet.Tables(1).Rows

                If (dr2("номерсс") <> "046-054-812 42") Then


                    dr2.Delete()

                End If
                copyDataSet.AcceptChanges()


            Next
Ora Starter
Дата: 25.01.2010 23:18:53
gulyaev.s,

да что ж такое сегодня! ты хоть читал ссылку? внимательно? найди как говорится 10 отличий :)
gulyaev.s
Дата: 25.01.2010 23:56:46
Ora Starter,
так пробовл тоже, ошибка та же.
For Each dr2 As DataRow In copyDataSet.Tables(1).Rows

                If (dr2("номерсс") <> "046") Then


                    dr2.Delete()

                End If
                copyDataSet.AcceptChanges()


            Next

gulyaev.s
Дата: 26.01.2010 00:24:28
gulyaev.s,
вернее вот так
For Each dr2 As DataRow In copyDataSet.Tables(1).Rows

                If (dr2("номерсс") <> "046") Then


                    dr2.Delete()

                End If
             


            Next
   copyDataSet.AcceptChanges()
Deft
Дата: 26.01.2010 11:44:15
Ты не можешь удалить из коллекции в цикле. Нужно поступать так:
- сначала в цикле ты создаешь список тех строк, которые нужно удалить
- потом в следующем цикле идешь по строкам, которые нужно удалить и удаляешь

Пример:


Не так:
For Each btn As tsButton In Me.tsWindows.Items
    If btn.myForm Is frm Then
        Me.tsWindows.Items.Remove(btn) 'Здесь будет ошибка потому что удаляешь из коллекции
    End If
Next

А вот так:
Dim tmpbtn As tsButton = Nothing
For Each btn As tsButton In Me.tsWindows.Items
    If btn.myForm Is frm Then
        tmpbtn = btn : Exit For
    End If
Next
If tmpbtn IsNot Nothing Then Me.tsWindows.Items.Remove(tmpbtn)

Я думаю из примера смысл понятен

_____________________________________________
Правды как минимум две...
дерево
Дата: 26.01.2010 12:31:31
Можно сразу в цикле. через Delete.

Главное взять правильную коллекцию.

У строк есть свойство - статус. Удаленная, добавленная, измененная. Весь фокус - надо взять коллекцию строк с любым статусом. Как говорил один киногерой:"Огласите весь список пожалуйста".

Когда вы берете copyDataSet.Tables(1).Rows, то у вас берутся строки только со статусом Current. Куда не входят строки со статусом Deleted. Вот поэтому и получается, что коллекция, которую вы взяли, изменяется. А это безусловно ошибка для For Each.

Лучше взять коллекцию из метода Select(). Тогда всё получится.

copyDataSet.Tables(1).Select()
gulyaev.s
Дата: 26.01.2010 15:31:01
дерево
Можно сразу в цикле. через Delete.

Главное взять правильную коллекцию.

У строк есть свойство - статус. Удаленная, добавленная, измененная. Весь фокус - надо взять коллекцию строк с любым статусом. Как говорил один киногерой:"Огласите весь список пожалуйста".

Когда вы берете copyDataSet.Tables(1).Rows, то у вас берутся строки только со статусом Current. Куда не входят строки со статусом Deleted. Вот поэтому и получается, что коллекция, которую вы взяли, изменяется. А это безусловно ошибка для For Each.

Лучше взять коллекцию из метода Select(). Тогда всё получится.

copyDataSet.Tables(1).Select()


УРААА
огромное спасибо!!!!!!! все получилось
МСУ
Дата: 26.01.2010 15:33:24
Ora Starter, в данном топике отличился. "Неоценимая" помощь была действенной.