none
Erro Ao tentar adicionar um produto no gridwiew carrinho de compras RRS feed

  • Pergunta

  • Preciso muito de ajuda, se alguem puder me ajudar por favor....Estou criando uma loja virtual e o erro ocorre quando clico no botão btnCarrinho para adicionar esse produto ao carrinho.

    Código botão default.aspx :

    <asp:ImageButton ID="btnCarrinho" CommandName="carrinho" runat="server" ImageUrl="images/cart.gif" Border="0"
     CssClass="left_bt" />

    codigo default.aspx.cs metodo onde passo o item.

                

     protected void dtlProdutos_ItemCommand(object sender, DataListCommandEventArgs e)
            {
                Carrinho carrinho = new Carrinho();
                ITEM_VENDA item = new ITEM_VENDA();
                PRODUTO produto = new PRODUTO();
                ProdutoBLL produtosBLL = new ProdutoBLL();



                if (e.CommandName == "carrinho")
                {
                    int codProduto = int.Parse(e.CommandArgument.ToString());

                    produto = produtosBLL.Find(p => p.IDT_PRODUTO == codProduto).First();

                    item.IDT_PRODUTO = int.Parse(e.CommandArgument.ToString());
                    item.QUANTIDADE = 1;
                    item.VALOR_UNITARIO = produto.VALOR;

                    carrinho.AdicionarItem(item);

                    Response.Redirect("CarrinhoCompra.aspx");
                }
            }

    metodo da classe carrinho onde retorna a lista de itens:

     public List<ITEM_VENDA> Itens { get { return BuscarLista(); } }

    metodo da classe carrinho onde adiciona o item.

     public void AdicionarItem(ITEM_VENDA item)
            {
                List<ITEM_VENDA> lista = Itens;

                //Verifica se o produto já existe na lista
                var resultado = lista.Where(i => i.IDT_PRODUTO == item.IDT_PRODUTO);

                if (resultado != null && resultado.Count() > 0)
                {
                    //Atualizar a quantidade de produto
                    AtualizarLista(item);
                }
                else
                {
                    item.SUBTOTAL = (item.VALOR_UNITARIO * item.QUANTIDADE);
                    lista.Add(item);
                    HttpContext.Current.Session["lista"] = lista;
                }
            }

    metodos da classe carrinho que busca a lista.

     private List<ITEM_VENDA> BuscarLista()
            {
                List<ITEM_VENDA> lista;

                if (HttpContext.Current.Session["lista"] != null)
                {
                    lista = (List<ITEM_VENDA>)HttpContext.Current.Session["lista"];
                }
                else
                {
                    lista = new List<ITEM_VENDA>();
                }

                return lista;
            }

    metodo da classe carrinho que atualiza a lista

    private void AtualizarLista(ITEM_VENDA item)
            {
                List<ITEM_VENDA> lista = Itens;

                //Verifica se o produto já existe na lista
                var resultado = lista.Where(i => i.IDT_PRODUTO == item.IDT_PRODUTO);

                if (resultado != null && resultado.Count() > 0)
                {
                    ITEM_VENDA itemEncontrado = resultado.First();

                    itemEncontrado.QUANTIDADE += item.QUANTIDADE;
                    itemEncontrado.SUBTOTAL = (itemEncontrado.QUANTIDADE * itemEncontrado.VALOR_UNITARIO);

                    HttpContext.Current.Session["lista"] = lista;
                }

            }

    classe carrinhoCompra 

                                                   

    public partial class CarrinhoCompra : System.Web.UI.Page
        {
            int codProduto;
            Carrinho car = new Carrinho();

            protected void Page_Load(object sender, EventArgs e)
            {
                lblMsg.Visible = false;

                    BuscarItens();

            }

    public void BuscarItens()
            {
                if (car.Itens.Count > 0)

                {
                    grvCarrinho.DataSource = car.Itens;
                    grvCarrinho.DataBind();
                    lblMsg.Visible = false;
                }
                else
               {
                    lblMsg.Text = "Não há Itens no Carrinho de Compra.";
                    lblMsg.Visible = true;
                    grvCarrinho.DataBind();
                }
            }
            protected void grvCarrinho_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType != DataControlRowType.Header && e.Row.RowType != DataControlRowType.Footer)
                {
                    codProduto = ((ITEM_VENDA)e.Row.DataItem).IDT_PRODUTO;
                    ProdutoBLL produtoBLL = new ProdutoBLL();

                    //busca o primeiro produto 
                    PRODUTO produto = produtoBLL.Find(p => p.IDT_PRODUTO == codProduto).First();

                    ((Label)e.Row.FindControl("lblDescricao")).Text = produto.NOME;

                    BuscarItens();
                }
                else if (e.Row.RowType != DataControlRowType.Footer)
                {
                    e.Row.Cells[1].Text = "Total de Itens Selecionados:" + car.QuantidadeTotal().ToString();
                    e.Row.Cells[4].Text = String.Format("{0:C}", car.QuantidadeTotal().ToString());
                }

            }

            protected void grvCarrinho_RowDeleting(object sender, GridViewDeleteEventArgs e)
            {
                //remove o item do carrinho
                if (car.ExcluirItem(int.Parse(grvCarrinho.DataKeys[e.RowIndex].Value.ToString())))
                {
                    //atualiza o carrinho
                    BuscarItens();
                }


            }
        }
    }

    terça-feira, 27 de agosto de 2013 15:57

Respostas

  • Leonardo, consegui achar o problema ...

    estava chamando o metodo buscar item no grvCarrinho_RowDataBound

     protected void grvCarrinho_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType != DataControlRowType.Header && e.Row.RowType != DataControlRowType.Footer)
                {
                    codProduto = ((ITEM_VENDA)e.Row.DataItem).IDT_PRODUTO;
                    ProdutoBLL produtoBLL = new ProdutoBLL();

                    //busca o primeiro produto 
                    PRODUTO produto = produtoBLL.Find(p => p.IDT_PRODUTO == codProduto).First();

                    ((Label)e.Row.FindControl("lblDescricao")).Text = produto.NOME;

                    //BuscarItens();
                }
                else if (e.Row.RowType != DataControlRowType.Footer)
                {
                    e.Row.Cells[1].Text = "Total de Itens Selecionados:" + car.QuantidadeTotal().ToString();
                    e.Row.Cells[4].Text = String.Format("{0:C}", car.QuantidadeTotal().ToString());
                }

            }

    muito obrigado pelas dicas e a atenção. :)

    • Marcado como Resposta Julio.Cesar terça-feira, 27 de agosto de 2013 19:54
    terça-feira, 27 de agosto de 2013 19:51

Todas as Respostas

  • E o erro ??????

    Leonardo Lourenço Silva


    terça-feira, 27 de agosto de 2013 16:09
  • O erro ocorre neste codigo : 

            

     public partial class LOJAEntities : ObjectContext
        {
            #region Constructors

            /// <summary>
            /// Initializes a new LOJAEntities object using the connection string found in the 'LOJAEntities' section of the application configuration file.
            /// </summary>
            public LOJAEntities() : base("name=LOJAEntities", "LOJAEntities") <<<<<<<<< NESTA LINHA >>>>>>>>>
            {
                this.ContextOptions.LazyLoadingEnabled = true;
                OnContextCreated();
            }

    ESTE ERRO : An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

    terça-feira, 27 de agosto de 2013 16:11
  • Como você está trabalhando em Camadas, o Entity Framework deve estar em uma camada de acesso a dados e a string de conexão dele dentro do arquivo App.Config.

    Faz um teste ae, abre o App.Config copia a String de conexão e joga para o Web.Config.


    Leonardo Lourenço Silva


    terça-feira, 27 de agosto de 2013 16:12
  • Leonardo,

    Estou trabalhando em 4 camadas(lojavirtual.admin,lojavirtual.BLL, lojavirtual.DAO e lojavirtual.WEB) 

    nas tres primeiras camadas nao tenho nenhum arquivo de configuração.Somente no projeto web , onde tenho web.config e nele esta esta string de conexão 

    <connectionStrings>
        <add name="LOJAEntities" connectionString="metadata=res://*/LojaVirtualEDM.csdl|res://*/LojaVirtualEDM.ssdl|res://*/LojaVirtualEDM.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=JULIO-PC;Initial Catalog=LOJA;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>

    Não entendi como fazer este teste.

    Oque posso fazer?

    Obrigado

    terça-feira, 27 de agosto de 2013 16:27
  • Seu projeto já está configurado, quem mexeu antes de você já fez isso...

    Essa loja virtual é a da DEVMEDIA ?

    A string de conexão está correta?


    Leonardo Lourenço Silva


    terça-feira, 27 de agosto de 2013 16:40
  • DevCursos ...Sim, porque o datalist da default.aspx esta buscando os produtos, sendo assim a string de conexao esta correta.

    Debugando: 

                   

     metodo da classe carrinhoCompra:

    public void BuscarItens()
            {

    //aqui car.itens.count = 1 
                if (car.Itens.Count > 0)

                {
                    grvCarrinho.DataSource = car.Itens;
                    grvCarrinho.DataBind();

    //depois do bind , volta pro inicio do metodo e assim fica ...  
                    lblMsg.Visible = false;
                }
                else
               {
                    lblMsg.Text = "Não há Itens no Carrinho de Compra.";
                    lblMsg.Visible = true;
                    grvCarrinho.DataBind();
                }
            }

    creio que o erro esteja aqui 

    obrigado.

    terça-feira, 27 de agosto de 2013 17:40
  • Quando estourar o erro no Visual Studio tira um print da janela de erro com todas as propriedades...

    Você chegou a alterar a estrutura das tabelas ?

    Nome de campos, nome de tabelas, relacionamentos, tipagens ?

    Se você alterou tem que atualizar o EDMX...


    Leonardo Lourenço Silva


    terça-feira, 27 de agosto de 2013 17:49
  • Não alterei a base e o edmx esta atualizado.


    terça-feira, 27 de agosto de 2013 18:03
  • Leonardo, consegui achar o problema ...

    estava chamando o metodo buscar item no grvCarrinho_RowDataBound

     protected void grvCarrinho_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType != DataControlRowType.Header && e.Row.RowType != DataControlRowType.Footer)
                {
                    codProduto = ((ITEM_VENDA)e.Row.DataItem).IDT_PRODUTO;
                    ProdutoBLL produtoBLL = new ProdutoBLL();

                    //busca o primeiro produto 
                    PRODUTO produto = produtoBLL.Find(p => p.IDT_PRODUTO == codProduto).First();

                    ((Label)e.Row.FindControl("lblDescricao")).Text = produto.NOME;

                    //BuscarItens();
                }
                else if (e.Row.RowType != DataControlRowType.Footer)
                {
                    e.Row.Cells[1].Text = "Total de Itens Selecionados:" + car.QuantidadeTotal().ToString();
                    e.Row.Cells[4].Text = String.Format("{0:C}", car.QuantidadeTotal().ToString());
                }

            }

    muito obrigado pelas dicas e a atenção. :)

    • Marcado como Resposta Julio.Cesar terça-feira, 27 de agosto de 2013 19:54
    terça-feira, 27 de agosto de 2013 19:51