Usuário com melhor resposta
Erro Ao tentar adicionar um produto no gridwiew carrinho de compras

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();
}
}
}
}
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
Todas as Respostas
-
-
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
-
- Sugerido como Resposta 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="Data Source=JULIO-PC;Initial Catalog=LOJA;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>Não entendi como fazer este teste.
Oque posso fazer?
Obrigado
-
-
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.
-
-
-
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