COLE?ÃO MODIFICADA: OPERA?ÃO DE ENUMERA?ÃO ...

ABREU 24/03/2016 17:17:56
#459851
Boa tarde a todos.

Meu aplicativo desenvolvido em VB.Net 2012, quando instalado em qualquer PC usuário roda corretamente, porém avisando que [Ô]A coleção foi modificada; talvez a operação de numeração não seja executada[Ô] (Veja o anexo).
Se eu click em [Ô]Continuar[Ô], o programa é executado, mas a mensagem aparece durante todo o uso, notadamente quando formulários são acionados ativando os controles ListView e ComboBox.

O erro não ocorre quando o aplicativo é instalado na máquina em que o projeto foi desenvolvido.

Tem um post aqui no VBMania que atribui esse erro ao PowerPacks, contudo a discussão não prosseguiu. O tópico foi encerrado.

Alguém tem ideia do que seja esse erro e por que ele ocorre? Seria um erro de programação?
Como posso corrigi-lo?
KERPLUNK 24/03/2016 19:25:50
#459863
Verifique o stacktrace clicando em [Ô]Detalhes[Ô], isso vai mostrar o que está acontecendo.
ABREU 24/03/2016 21:42:51
#459877
Segue abaixo o texto obtido em Detalhes. Não entendi nada!
Tudo está muito além do meu conhecimento e da minha capacidade.
Habilitei a depuração JIT no arquivo Config como exemplificado no final da mensagem e tudo continuou como antes.
Estou totalmente sem ação, não sei nem o que dizer...


Consulte o final desta mensagem para obter detalhes sobre como chamar a
depuração just-in-time (JIT) em vez desta caixa de diálogo.

************** Texto de Exceção **************
System.InvalidOperationException: Coleção foi modificada; talvez a operação de enumeração não seja executada.
em System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
em System.Collections.Generic.List'1.Enumerator.MoveNextRare()
em System.Collections.Generic.List'1.Enumerator.MoveNext()
em Microsoft.VisualBasic.PowerPacks.ShapeCollection.Dispose(Boolean disposing)
em Microsoft.VisualBasic.PowerPacks.ShapeContainer.Dispose(Boolean disposing)
em System.ComponentModel.Component.Dispose()
em System.Windows.Forms.Control.Dispose(Boolean disposing)
em System.ComponentModel.Component.Dispose()
em System.Windows.Forms.Control.Dispose(Boolean disposing)
em System.ComponentModel.Component.Dispose()
em System.Windows.Forms.Control.Dispose(Boolean disposing)
em System.Windows.Forms.Form.Dispose(Boolean disposing)
em MeusLivros.frm01_02_00_00.Dispose(Boolean disposing) na C:\Users\Wenceslau\Documents\Visual Studio 2012\Projects\MeusLivros\MeusLivros\frm01_02_00_00.Designer.vb:linha 13
em System.ComponentModel.Component.Dispose()
em System.Windows.Forms.Form.WmClose(Message& m)
em System.Windows.Forms.Form.WndProc(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
em System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Assemblies Carregados **************
mscorlib
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
MeusLivros
Versão do Assembly: 1.0.0.0
Versão do Win32: 1.0.0.0
Base de Código: file:///C:/MeusLivros/MeusLivros.exe
----------------------------------------
Microsoft.VisualBasic
Versão do Assembly: 10.0.0.0
Versão do Win32: 12.0.51209.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34238 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Windows.Forms
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34251 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34285 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Runtime.Remoting
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34245 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
System.Data
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Xml
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34283 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Microsoft.VisualBasic.PowerPacks.Vs
Versão do Assembly: 10.0.0.0
Versão do Win32: 10.0.20911.1
Base de Código: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.VisualBasic.PowerPacks.Vs/10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.PowerPacks.Vs.dll
----------------------------------------
System.Data.DataSetExtensions
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Data.DataSetExtensions/v4.0_4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll
----------------------------------------
System.Numerics
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
----------------------------------------
mscorlib.resources
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_pt-BR_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
System.Configuration
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
Accessibility
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
System.Windows.Forms.resources
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_pt-BR_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
System.Transactions
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
System.EnterpriseServices
Versão do Assembly: 4.0.0.0
Versão do Win32: 4.0.30319.34209 built by: FX452RTMGDR
Base de Código: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.EnterpriseServices/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------
Microsoft.mshtml
Versão do Assembly: 7.0.3300.0
Versão do Win32: 7.0.3300.0
Base de Código: file:///C:/Windows/assembly/GAC/Microsoft.mshtml/7.0.3300.0__b03f5f7f11d50a3a/Microsoft.mshtml.dll
----------------------------------------

************** Depuração JIT **************
Para habilitar a depuração just-in-time (JIT), o arquivo .config deste
aplicativo ou computador (machine.config) deve ter o valor
jitDebugging definido na seção system.windows.forms.

O aplicativo também deve ser compilado com a depuração
habilitada.

Por exemplo:

<configuration>
<system.windows.forms jitDebugging=[Ô]true[Ô] />
</configuration>

Quando a depuração JIT está habilitada, qualquer exceção sem tratamento
será enviada ao depurador JIT registrado no computador,
em vez de ser tratada nesta caixa de diálogo.
KERPLUNK 24/03/2016 21:52:43
#459879
A linha [Ô]em MeusLivros.frm01_02_00_00.Dispose(Boolean disposing) na C:\Users\Wenceslau\Documents\Visual Studio 2012\Projects\MeusLivros\MeusLivros\frm01_02_00_00.Designer.vb:linha 13[Ô] não te diz absolutamente nada?
FFCOUTO 24/03/2016 22:07:08
#459884
Resposta escolhida
Posso estar enganado, mas tudo indica que é uma tentativa de remover um item de alguma coleção usando o foreach. Isso vai dar erro mesmo, uma vez que ao remover algum item a coleção é mudada e o foreach fica sem a referência original.

Para corrigir isso há duas maneira: 1) usando o Linq para seleciona os registros que serão excluídos com um determinado critério e atribuido o resultado a lista; 2) cria uma nova lista contendo somente os itens que deverão ser excluídos e, em seguida, faça o laço removendo esses itens da lista original.
ABREU 25/03/2016 05:40:43
#459899
Prezado Fabiano,

Realmente o erro parece estar ligado a um laço ForEach/Next.
Encontrei vários artigos na rede que fazem esse mesmo relacionamento com o dito laço, mas todos inconclusivos e nunca em VB.Net.

Na verdade o erro aparece quando formulários são acionados ativando os controles ListView ou ComboBox, mas não numa tentativa de remover um item de alguma coleção, mas apenas para preenchimento do controle e exibição dos registros contidos no banco de dados.

O intrigante é que isso tudo só ocorre quando o aplicativo está instalado no PC do usuário. Nunca acontece em sede de projeto e nem quando o aplicativo é instalado na mesma máquina em que o projeto foi desenvolvido.

Por exemplo, tenho um formulário que ao ser ativado, mostra uma ListView com todos os livros contidos numa tabela. Aí ocorre o erro!
Eis o código no evento Load do referido formulário:

Dim ConectaLivros As New OleDbConnection
Dim ds As New DataSet
Dim dr As DataRow
Dim dt As New DataTable

ConectaLivros.ConnectionString = [Ô]Provider=Microsoft.ACE.OLEDB.12.0;[Ô] _
& [Ô]Data Source=Livros.accdb;Jet OLEDB:System database=system.mdw;[Ô]
ConectaLivros.Open()

Try
Dim SQL As String = [Ô]Select * from T012 Order by Titulo[Ô]
ds.Reset()
Dim adptr As New OleDbDataAdapter(SQL, ConectaLivros)
adptr.Fill(ds)
dt = ds.Tables(0)
lstLivros.Items.Clear()
Dim Item As ListViewItem
For Each Me.dr In dt.Rows
Item = lstLivros.Items.Add(dr.Item([Ô]Id[Ô]))
Item.SubItems.Add(dr.Item([Ô]Titulo[Ô]))
Item.SubItems.Add(dr.Item([Ô]Autor[Ô]))
Item.SubItems.Add(dr.Item([Ô]Assunto[Ô]))
Item.SubItems.Add(dr.Item([Ô]Volume[Ô]))
Item.SubItems.Add(dr.Item([Ô]Edicao[Ô]))
Item.SubItems.Add(dr.Item([Ô]Ano[Ô]))
Item.SubItems.Add(dr.Item([Ô]Editora[Ô]))
Item.SubItems.Add(dr.Item([Ô]Cidade[Ô]))
Next
Catch ex As Exception
MsgBox([Ô]Erro: [Ô] & ex.Message)
End Try

ConectaLivros.Close()

Se o erro estiver ligado ao laço ForEach/Next como desconfiamos, sinceramente não sei como resolvê-lo. Estou precisando de muita ajuda.


Caro KERPLUNK,

Desculpa o meu desconhecimento, talvez sobre uma questão de natureza tão primária; mas eu nunca incursionei pelos scripts do Designer dos formulários. Sempre me limitei a ficar no âmbito do Designer gráfico e do Código de programação.
Se o erro que apareceu estiver no aludido script, é matéria nova para mim a qual terei que aprender desde o começo contando com a sua ajuda.

Eis a linha 13 do meu frm01_02_00_00.Designer.vb - Sinceramente não sei o que fazer com esse código para resolver o erro que está se apresentando.

1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
2. Partial Class frm01_02_00_00
3. Inherits System.Windows.Forms.Form
4.
5. [ô]Descartar substituições de formulário para limpar a lista de componentes.
6. <System.Diagnostics.DebuggerNonUserCode()> _
7. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
8. Try
9. If disposing AndAlso components IsNot Nothing Then
10. components.Dispose()
11. End If
12. Finally
13. MyBase.Dispose(disposing)
14. End Try

A numeração foi colocada para melhor localização da linha 13. Conto com sua ajuda!

DS2T 25/03/2016 07:24:20
#459902
Duvido muito que o erro esteja nessa parte do código:

   Try
Dim SQL As String = [Ô]Select * from T012 Order by Titulo[Ô]
ds.Reset()
Dim adptr As New OleDbDataAdapter(SQL, ConectaLivros)
adptr.Fill(ds)
.......
Catch ex As Exception
MsgBox([Ô]Erro: [Ô] & ex.Message)
End Try


Porque o erro seria tratado com o bloco Try. Aquele é um erro gerado sem tratamento algum.
Coloque um Breakpoint nessa parte do código:

13.       MyBase.Dispose(disposing)



E verifique quem está chamando isso daí. Se tiver sendo chamado dentro de um For Each, provavelmente encontrou seu erro.
ABREU 25/03/2016 09:41:26
#459906
Caros amigos,

Fiz o Breakpoint, mas a execução do programa passou batida e a exceção avisando que [Ô]A coleção foi modificada; talvez a operação de numeração não seja executada[Ô] persistiu!

Considerando um post existente aqui no nosso Fórum que atribui esse erro ao PowerPacks, fiz mais alguns testes com o aplicativo e constatei que a exceção ocorre, não quando se abre um formulário que contém o laço ForEach/Next, mais sim quando se fecha um formulário que efetivamente contém componentes do Microsoft Visual Basic PowerPacks 10.0.

Conduzi pesquisas na rede nesse sentido e encontrei um código substitutivo para o topo dos formulários que utilizam componentes do PowerPacks. Segundo o artigo encontrado, essa sintaxe é a chave do problema.

Eis o código:

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frmMain
Inherits System.Windows.Forms.Form
[ô]Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
LineShape1.Dispose() : LineShape2.Dispose() : LineShape3.Dispose()
components.Dispose()
End If
Finally
LineShape1.Dispose() : LineShape2.Dispose() : LineShape3.Dispose()
MyBase.Dispose(disposing)
End Try
End Sub

Ainda não testei esse código porque, como eu já disse acima, nunca incursionei pelos scripts do Designer dos formulários e estou mais tonto do que barata no galinheiro!

Assim sendo, antes de fazer qualquer teste, eu gostaria de ter a opinião dos amigos do VBMania!...
ABREU 27/03/2016 08:06:57
#459942
Fiz a minha primeira incursão pelos códigos do form.Designer.vb e apliquei a função DisposeShapeContainer. Tudo foi resolvido satisfatoriamente.
Tratava-se de erro provocado pela utilização de componentes do PowerPacks:

Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing Then DisposeShapeContainer(ShapeContainer1)
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub

Protected Sub DisposeShapeContainer(ByVal AShapeContainer As Microsoft.VisualBasic.PowerPacks.ShapeContainer)
If AShapeContainer IsNot Nothing Then
If AShapeContainer.Shapes IsNot Nothing Then
Dim tshapes As New Generic.List(Of Microsoft.VisualBasic.PowerPacks.Shape)
For Each tshape As Microsoft.VisualBasic.PowerPacks.Shape In AShapeContainer.Shapes
tshapes.Add(tshape)
Next
AShapeContainer.Shapes.Clear()
AShapeContainer.Shapes.Dispose()
For Each tshape As Microsoft.VisualBasic.PowerPacks.Shape In tshapes
tshape.Dispose()
Next
End If
AShapeContainer.Dispose()
End If
End Sub

Muito obrigado a todos os que participaram deste tópico e que tentaram me ajudar!

ABREU 27/03/2016 08:08:56
#459943
Fiz a minha primeira incursão pelos códigos do form.Designer.vb e apliquei a função DisposeShapeContainer. Tudo foi resolvido satisfatoriamente.
Tratava-se de erro provocado pela utilização de componentes do PowerPacks:

Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing Then DisposeShapeContainer(ShapeContainer1)
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub

Protected Sub DisposeShapeContainer(ByVal AShapeContainer As Microsoft.VisualBasic.PowerPacks.ShapeContainer)
If AShapeContainer IsNot Nothing Then
If AShapeContainer.Shapes IsNot Nothing Then
Dim tshapes As New Generic.List(Of Microsoft.VisualBasic.PowerPacks.Shape)
For Each tshape As Microsoft.VisualBasic.PowerPacks.Shape In AShapeContainer.Shapes
tshapes.Add(tshape)
Next
AShapeContainer.Shapes.Clear()
AShapeContainer.Shapes.Dispose()
For Each tshape As Microsoft.VisualBasic.PowerPacks.Shape In tshapes
tshape.Dispose()
Next
End If
AShapeContainer.Dispose()
End If
End Sub

Muito obrigado a todos os que participaram deste tópico e que tentaram me ajudar!

Tópico encerrado , respostas não são mais permitidas