none
erro no foreach RRS feed

  • Pergunta

  • eu tenho numa aplicaçõ detes um datagrid onde eu marco os regisros que vão ser excluido, porem o erro ñ é este e sim quando eu faço o foreach...o vs me acusa o erro no "IN"... abaixo esta todo o bloco do foreach e logo a seguri o erro

    Desde já agradeço

    msn: elandf@hotmail.com

     

     

    foreach (DataGridItem itens in this.DataGrid1.Items)

    {

    CheckBox ck = (CheckBox)itens.FindControl("ckItem");

    Label id = (Label)itens.FindControl("lblId");

    if (ck != null && ck.Checked)

    sExcluir.excluirDados(Convert.ToInt32(id.Text));

    preencheGrid();

    }

    erro que dá é esse:

    System.InvalidOperationException was unhandled by user code
      Message="Coleção foi modificada; talvez a operação de enumeração não seja executada."
      Source="mscorlib"
      StackTrace:
           em System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()
           em frmRelatorio.cmdDeletar_Click(Object sender, EventArgs e) na c:\Documents and Settings\Elan\Meus documentos\Visual Studio 2005\WebSites\PrimeiroSistema\frmRelatorio.aspx.cs:linha 50
           em System.Web.UI.WebControls.Button.OnClick(EventArgs e)
           em System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
           em System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
           em System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
           em System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
           em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

    segunda-feira, 18 de dezembro de 2006 17:08

Respostas

  • Ola, Elan.

    Esse erro é pq vc esta percorrendo um numero X de itens no datagrid e derrepente vc tira um e popula novamente o datagrid o X nao é mais o mesmo agora ele é X - 1. O q vc poderia fazer é o seguinte criar uma string CSV com os IDS separados por "," e passar para uma proc deletar todos de uma so vez.


    Espero ter ajudado.

    []'s

     

    segunda-feira, 18 de dezembro de 2006 17:15

Todas as Respostas

  • Ola, Elan.

    Esse erro é pq vc esta percorrendo um numero X de itens no datagrid e derrepente vc tira um e popula novamente o datagrid o X nao é mais o mesmo agora ele é X - 1. O q vc poderia fazer é o seguinte criar uma string CSV com os IDS separados por "," e passar para uma proc deletar todos de uma so vez.


    Espero ter ajudado.

    []'s

     

    segunda-feira, 18 de dezembro de 2006 17:15
  • nossa este foi um erro muito primário...mil desculpas pessoal, eu coloquei o função para recarregar o grid na foreach...

    wlw diego...tu matou a charada...peço desculpas pois é um erro bobo...brigado

    segunda-feira, 18 de dezembro de 2006 18:57
  • Bom dia,

    Estou tendo o mesmo problema porém em um cenário um tanto quanto diferente:
    Tenho um Accordion onde adiciono os Panes, porém como estou gerando-os dinamicamente a cada post eu os perdo e preciso adicionar novamente, como é uma operação custosa ( buscar no banco, gerar os linkbuttons e atrelar a um evento ), eu só estou gerando uma única vez e depois guardo em cache, ai quando necessito novamente eu recupero deste cache e adiciono novamente.

    Porém quando estou tentando adicionar novamente tenho este mesmo problema, alguém sabe como me ajudar ?
    Não estou removendo nada como no exemplo acima, só estou adicionando novamente.

    AccordionPaneCollection Panes = (AccordionPaneCollection)AppCacheManager.ObtemCachePanes();
    
            // SE O MEU CACHE FOR NULO
            if (Panes == null)
            {
                 // Tudo é Gerado ...
            }
            // SE JÁ TENHO EM CACHE
            else
            {
                // SE O MEU ACCORDION ESTIVER SEM PANELS
                if (accMenuCidadeLoja.Panes.Count == 0)
                {
                    " O ERRO É GERADO NESTE 'IN' "
                    foreach (AccordionPane pane in Panes)
                    {                    
                        accMenuCidadeLoja.Panes.Add(pane);
                    }
                }
            }

    quarta-feira, 6 de janeiro de 2010 11:39
  • Qual é o erro gerado ?

    Charles, a princípio acho que falta você fazer a conversão do seu objecto Cache "Panes" em um objeto Accordion.

    Algo desse tipo:

    AjaxControlToolkit.Accordion objAccordion = new AjaxControlToolkit.Accordion();
    objAccordion = ((AjaxControlToolkit.Accordion)Panes);
    foreach (AccordionPane pane in objAccordion.Panes)
    etc.....

    quarta-feira, 6 de janeiro de 2010 11:46
  • O erro é exatamente o mesmo que o Elan teve "Coleção foi modificada; talvez a operação de enumeração não seja executada."
    Meu Objeto que estava em Cache é um AccordionPaneCollection, que fiz o cast na primeira linha.
    Depois para cada Pane nesta collection é que faço o for each, e vou adicionando.
    quarta-feira, 6 de janeiro de 2010 11:51
  • Valeu Kaue, porém resolvi de outra forma, ao invés de guarda um PanelCollection em cache, guarde um List<AccorionPane>();

    e depois o for each no mesmo não resulta em erro, não sei dizer qual é o motivo para o problema, talvez o PanelCollection guarde alguma ligação com o AccordionPanel e quando adiciono um item novo no accordion ele diz que a coleção foi alterada, sei lá.

    De qualquer forma, com o List funcionou.
    • Sugerido como Resposta Charles Camargo quarta-feira, 6 de janeiro de 2010 12:06
    quarta-feira, 6 de janeiro de 2010 12:06