ASP .NET - Criando um carrinho de compras II (VB .NET)
Na primeira parte deste artigo foram definidos os requisitos do nosso web site e foram criados o modelo de dados e as classes do nosso domínio; também criamos as páginas Pedidos.aspx e Carrinho.aspx.
Vamos continuar definindo o código da página Pedido.aspx e também o leiaute e o código da página Carrinho.aspx.
Quando a página Pedido.aspx for carregada o dropdownlist da página deverá ser preenchido de forma a exibir o nome dos produtos data tabela Produtos;
Quando um produto for selecionado deverão ser exibidas na página a sua imagem e informações de forma que o cliente possa informar a quantidade desejada e incluir o item no carrinho de compras.
Abaixo vemos a página Pedidos.aspx exibindo um produto:
Definindo o código da página Pedidos.aspx
Vamos agora definir o código da página Pedidos.aspx de forma a permitir que resultado obtido seja o da figura acima.
Selecione o arquivo Pedidos.aspx na janela Solution Explorer e abra o code-behind no arquivo Pedidos.aspx.vb
Como vamos acessar um banco de dados via ADO .NET precisamos definir o seguinte namespace no início do arquivo:
Imports System.Data
Após a definição da classe vamos declarar uma variável do tipo Produto chamada produtoSelecionado que representará um produto selecionado pelo cliente:
Private produtoSelecionado As Produto
Em seguida vamos definir o código no evento Load da página :
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then ddlProdutos.DataBind() End If produtoSelecionado = Me.GetProdutoSelecionado lblNome.Text = produtoSelecionado.Nome lblResumo.Text = produtoSelecionado.Resumo lblDescricao.Text = produtoSelecionado.Descricao lblPreco.Text = FormatCurrency(produtoSelecionado.Preco) imgProduto.ImageUrl = "Imagens/" & produtoSelecionado.Imagem End Sub |
Neste código verificamos se não é um PostBack e vinculamos o DropDowList aos produtos selecionados na tabela Produtos. Lembre-se que estamos fazendo o acesso nesta tabela usando o componente AccessDataSource e vinculando o DropDownList ao componente. Veja abaixo o código da página que faz exatamente isso:
..... <asp:DropDownList ID="ddlProdutos" runat="server" DataSourceID="AccessDataSource1" DataTextField="Nome" DataValueField="produtoid" Width="150px" AutoPostBack="True"> </asp:DropDownList> <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/App_Data/Vendas.mdb" SelectCommand="SELECT [produtoid], [nome], [resumo],[descricao], [imagem], [preco] FROM [Produtos] ORDER BY [nome]"> </asp:AccessDataSource> ..... |
A seguir estou chamando o método GetProdutoSelecionado para obter as informações do produto e exibir essas informações nas Labels da página.
O método GetProdutoSelecionado possui o seguinte código:
Private Function GetProdutoSelecionado() As Produto Dim produtoTabela As DataView = CType(AccessDataSource1.Select(DataSourceSelectArguments.Empty), DataView) produtoTabela.RowFilter = "ProdutoID = '" & ddlProdutos.SelectedValue & "'" Dim productRow As DataRowView = produtoTabela(0) Dim produto1 As New Produto produto1.ProdutoID = productRow("produtoid").ToString produto1.Nome = productRow("Nome").ToString produto1.Resumo = productRow("Descricao").ToString produto1.Descricao = productRow("Resumo").ToString produto1.Preco = CDec(productRow("Preco")) produto1.Imagem = productRow("Imagem").ToString Return produto1 End Function |
Este método retorna um Produto selecionado a partir do controle DropDownList(ddlProdutos). Para isso estamos usando um DataView onde usando o método RowFilter estamos selecionado o produto pelo seu código obtido do dropdownlist.
Um DataView permite criar diferentes visões dos dados armazenados em um DataTable permitindo diversos critérios para ordenação e filtragem de dados. Apesar disto tenha em mente que um DataView não pode ser tratado com uma tabela e não permite visões de tabelas combinadas. Não permite também que se inclua o exclua colunas que não existam na tabela original.
Em meu artigo - VB .NET - ADO.NET - Uma visão geral III : DataView. - já tratei das principais propriedades do objeto DataView e a forma como podemos criar um DataView.
DataView.RowFilter
- Podemos usar um DataView baseado em um
Datatable para localizar registros das seguintes formas :
|
Após isso criamos um objeto Produto e atribuímos ao mesmo as informações do produto selecionado.
No evento Click do botão - Incluir no Carrinho - vamos definir o seguinte código:
Protected Sub btnIncluir_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnIncluir.Click If Page.IsValid Then Dim carrinho As ItemLista = ItemLista.GetCarrinho Dim itemCarrinho As Item = carrinho(produtoSelecionado.ProdutoID) If itemCarrinho Is Nothing Then carrinho.IncluirItem(produtoSelecionado, CInt(txtQuantidade.Text)) Else itemCarrinho.IncluiQuantidade(CInt(txtQuantidade.Text)) End If Response.Redirect("Carrinho.aspx") End If End Sub |
Este código define um variável do tipo ItemLista que vai usa o método GetCarrinho para obter o carrinho da sessão. Veja o código do método GetCarrinho():
Public Shared Function GetCarrinho() As ItemLista If CType(HttpContext.Current.Session("Carrinho"), ItemLista) Is Nothing Then HttpContext.Current.Session.Add("Carrinho", New ItemLista) End If Return CType(HttpContext.Current.Session("Carrinho"), ItemLista) End Function |
Em seguida verificamos se o item do carrinho é nulo e usamos o método IncluirItem(), mostrado abaixo, para incluir o item selecionado no carrinho.
Public Sub IncluirItem(ByVal produto As Produto, ByVal quantidade As Integer) Dim c As New Item(produto, quantidade) itensLista.Add(c) End Sub |
Ao final redirecionamos o cliente para a página Carrinho.aspx.
Definindo o leiaute da página Carrinho.aspx
Vamos definir o leiaute da página Carrinho.aspx que será a página que representa o nosso carrinho de compras contendo os itens selecionados pelo cliente.
Na figura abaixo temos o leiaute da página:
Controles usados na
página Carrinhos.aspx:
|
Abaixo temos o código fonte gerado para a página:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Carrinho.aspx.vb" Inherits="Carrinho" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>Carrinho de Compras</title> <style type="text/css"> .style1 { width: 100%; } .style2 { width: 285px; height: 155px; } .style3 { height: 155px; } </style> </head> <body> <form id="form1" runat="server"> <div> <asp:Image ID="Image1" runat="server" ImageUrl="~/Imagens/maco10.gif" /><br /><br /> Seu Carrinho de Compras:<br /><br /> <table class="style1" cellpadding="0" cellspacing="0"> <tr> <td class="style2" valign="top"> <asp:ListBox ID="listaCarrinho" runat="server" Height="135px" Width="275px"></asp:ListBox> </td> <td class="style3" valign="top"> <asp:Button ID="btnRemover" runat="server" Text="Remover Item" Width="112px" /><br /><br /> <asp:Button ID="btnEsvaziar" runat="server" Text="Esvaziar Carrinho" Width="112px" /> </td> </tr> </table> <br /> <asp:Button ID="btnContinuar" runat="server" PostBackUrl="~/Pedido.aspx" Text="Continuar Comprando" /> <asp:Button ID="btnEncerrar" runat="server" Text="Encerrar Compras" /><br /> <br /> <asp:Label ID="lblMensagem" runat="server" ForeColor="Green" EnableViewState="False"></asp:Label> </div> </form> </body> </html> |
Esta página deverá exibir os itens selecionados e permitir que o cliente continue comprando ou encerre as compras (não implementado). O cliente poderá também remover itens selecionados ou esvaziar o carrinho.
Abaixo as figuras que mostra a seqüência de execução onde na página Pedidos.aspx o cliente seleciona um produto e na página Carrinho.aspx o item selecionado é exibido:
Pedidos.aspx |
Carrinhos.aspx |
Vejamos a seguir o código da página Carrrinho.aspx necessário para implementar o comportamento esperado.
Definindo o código da página Carrinho.aspx
Selecione o arquivo Carrinho.aspx e abra o code-behind no arquivo Carrinho.aspx.vb.
Logo após a declaração do formulário vamos definir uma variável carrinho do tipo ItemLista:
Private carrinho As ItemLista
Em seguida no evento Load da página inclua o código a seguir:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load carrinho = ItemLista.GetCarrinho If Not IsPostBack Then Me.ExibeCarrinho() End If End Sub |
O código utiliza o método GetCarrinho da classe ItemLista. Esse método obtém um carrinho da sessão.
A seguir, se não for um PostBack, chamamos o método ExibeCarrinho().
O código do método ExibeCarrinho() é dado a seguir:
Private Sub ExibeCarrinho() listaCarrinho.Items.Clear() Dim itemCarrinho As Item For i = 0 To carrinho.Count - 1 itemCarrinho = carrinho(i) listaCarrinho.Items.Add(itemCarrinho.Exibir) Next End Sub |
No código acima primeiro limpamos o controle ListBox; a seguir declaramos a variável itemCarrinho do tipo Item que representa um item selecionado.
Depois usamos um laço for/next para percorrer o carrinho e incluir os itens no Listbox.
O código do evento Click do botão Remover é mostrado a seguir:
Protected Sub btnRemover_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRemover.Click If carrinho.Count > 0 Then If listaCarrinho.SelectedIndex > -1 Then carrinho.RemoverEm(listaCarrinho.SelectedIndex) Me.ExibeCarrinho() Else lblMensagem.Text = "Selecione um item que deseja remover." End If End If End Sub |
Este código verifica se existem itens no controle ListBox depois verifica se existe um item selecionado e remove o item da lista para depois exibir novamente o carrinho.
O código do botão Esvaziar é exibido abaixo:
Protected Sub btnEsvaziar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEsvaziar.Click If carrinho.Count > 0 Then carrinho.Limpar() listaCarrinho.Items.Clear() End If End Sub |
O código verifica se o controle ListBox esta vazio e remove todos os itens do controle.
Para encerrar o código do botão Encerrar apenas mostra a mensagem de que a rotina não esta implementada.
Protected Sub btnEncerrar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEncerrar.Click lblMensagem.Text = "Esta funcionalidade ainda não foi construída." End Sub |
E assim eu mostrei como implementar um carrinho de compras bem simples usando ASP .NET Web Forms. O objetivo foi mostrar os recursos básicos envolvidos neste processado e fornecer subsídios para que você saiba por onde começar , se um dia precisar criar um carrinho de compras usando ASP .NET.
Pegue o projeto completo aqui: CarrinhoCompras.zip
"Passará o céu e a terra, mas as minhas palavras jamais passarão." (Mateus 24:35)
Referências: