sexta-feira, 12 de novembro de 2010

C# - Carrinho de Compras


Primeiro passo : Criar um SQL DataSource apontando para a tabela products.
Passo simples, sem mistérios. É sem dúvida interessante observar que o SQL Data Source sugere que a string de conexão seja gravada no web.config
Cc518027.artigo01012006-01(pt-br,MSDN.10).jpg
(Tela do Wizard do SQL DataSource, na qual você chegará selecionando o SQL DataSource, clicando na seta em seu canto superior direito - a smartTag - e selecionando "Configure DataSource")
Nesta tela vemos a escolha da conexão. Ao contrário do que muitos pensam, o sqlDataSource não é exclusivo para SQL Server, mas serve para qualquer banco servidor. Se clicar em "new connection" terá a opção de montar strings de conexão para quaisquer outros bancos, inclusive escolhendo o data provider do ADO.NET que deseja utilizar.
É interessante também observar a existencia de um novo provider OLEDB para SQL Server, o SQLNCLI - SQL Server Native Client. Este provider libera para uso via OLEDB os novos recursos existentes no SQL Server 2005.
Cc518027.artigo01012006-02(pt-br,MSDN.10).jpg
(tela seguinte do Wizard)
Nesta tela nos é dada a opção de gravar a string de conexão recem criada no web.config, garantindo assim que a string de conexão ficará centralizada para toda a aplicação.
Optando por salvar a string de conexão, o que é a opção default, da próxima vez que for criado um dataSource a string de conexão aparecerá como opção na tela anterior.
O novo web.config permite que as chaves possam ser criptografadas. Mas isso não pode ser feito diretamente pela interface, precisa ser feito por código. Você pode conferir um outro artigo sobre isso em http://www.bufaloinfo.com.br/artigos/coluna31.asp
Cc518027.SNAG-0026(pt-br,MSDN.10).jpg
Nesta tela, a seguinte no wizard, podemos escolher os dados que iremos trazer na query. Podemos montar dinâmicamente a seleção dos campos, o where, order by e até mesmo pedir um distinct.
Para querys mais avançadas podemos alterar a opção do radio button e teremos a opção de utilizar um query builder completo para a montagem da query, como mostra a tela a seguir. Precisaremos fazer isso para a nossa query.
Cc518027.artigo01012006-03(pt-br,MSDN.10).jpg
Observe que nesta query especificamente estamos trazendo um campo a mais, Quant, como zero, de forma fixa. Este campo não existe na tabela. Mais adiante você poderá observar o truque que criaremos com esse campo.
Cc518027.artigo01012006-04(pt-br,MSDN.10).jpg
Por fim, na tela seguinte do wizard, podemos testar a query. Se houver algum parâmetro, esta tela nos solicitará os parâmetros da query para poder realizar o teste.
Segundo Passo : Criar e configurar uma gridView
Também é uma tarefa bem simples, bastando inserir a gridView na página e liga-la com o dataSource. Selecionamos então os campos que desejamos exibir : ProductName e UnitPrice .
Podemos determinar a formatação do campo unitprice definindo a DataFormatingExpression como {0:C}, uma expressão de formatação para números em formato monetário.
Podemos também pedir que a coluna de unitPrice seja toda alinhada a direita, já que trata-se de valores numéricos.
Cc518027.artigo01012006-05(pt-br,MSDN.10).jpg
(Gridview já configurada - através da opção edit columns - mostrando sua smartTag já ligada ao SQLDataSource1)
Terceiro passo : Caixa com quantidade
Agora precisamos inserir uma caixa de texto para o usuário poder digitar a quantidade que deseja de cada produto. Para isso precisaremos inserir uma template column. Pedimos para editar a coluna de template e inserimos uma textbox no itemTemplate.
Cc518027.artigo01012006-06(pt-br,MSDN.10).jpg
(Edição do template - depois de inserido - na qual se chega com click do botão direito na gridView - Edit Templates)
Cc518027.artigo01012006-07(pt-br,MSDN.10).jpg
(Resultado da Gridview após a edição do template)
Mas existe um detalhe a mais em relação a esta caixa de quantidade : Vamos fazer um vinculo de dados desta caixa com o campo Quant. Isso mesmo, aquele campo inexistente no qual estamos trazendo zero.
Mais adiante você entenderá melhor a finalidade deste truque.
Cc518027.artigo01012006-12(pt-br,MSDN.10).jpg
(Vinculo de dados com o campo quant - clica-se na smartTag da textBox do template e seleciona-se dataBindings)
Quarto passo : Validação dos dados
A caixa de quantidade de cada produto precisa ser validada conforme o usuário solicitar a compra. Mas haverão muitos produtos na gridView e não vamos validar todas as caixas de quantidade, mas apenas a caixa do produto que o usuário deseja comprar.
Podemos utilizar os validadores para testar os dados, mas como garantir que só o objeto de validação correto vai ser disparado ?
Simples : O validationGroup. Essa nova propriedade serve exatamente para que possamos agrupar os validadores, controlando quais grupos serão disparados a cada momento.
Mas como fazer com que cada linha da grid tenha um validationGroup diferente ?
Mais uma vez, simples : Podemos fazer databinding com a propriedade validationGroup, vinculando o validationGroup com a chave primária da tabela.
Cc518027.artigo01012006-08(pt-br,MSDN.10).jpg
(O template já com os validadores)
Cc518027.artigo01012006-09(pt-br,MSDN.10).jpg
(O dataBinding do validationGroup. Observe a opção "Show all properties" marcada)
Quinto passo : Botão de gravação
Vamos criar um botão para que o usuário possa, após digitar a quantidade, inserir o item na cesta de compras. Para isso vamos inserir uma nova templateColumn e um ImageButton.
Para evitarmos a codificação, vamos utilizar um truque : vamos definir a propriedade CommandName como Update. Isso irá disparar o processo de Update da gridview. Isso mesmo, a gridView não precisa estar em modo de edição, se o botão tem o CommandName de Update a griview irá disparar o processo de Update.
Precisaremos também definir o validationGroup do botão. Para isso iremos também fazer o vinculo de dados com o botão.
Cc518027.artigo01012006-10(pt-br,MSDN.10).jpg
(O template, já com o botão inserido)
Sexto Passo : Configurar a query de update no SQLDataSource
Devido ao fato do ImageButton que utilizamos na gridView estar com o CommandName de update, quando clicado ele irá disparar automaticamente o update no SQLDataSource.
Configurando então o update, teremos um resultado imediato com o mínimo de codificação. Mas não precisamos criar uma query de update : O update no dataSource pode fazer um insert na tabela de cesta de compras.
De fato a grid já possui 2 dos campos que vamos desejar inserir : o id do produto e a quantidade. Lembra-se do truque que fizemos com a quantidade ? Esse truque garantirá que ela seja preenchida automaticamente pela gridView.
Precisaremos apenas adicionar o identificador. do usuário e pronto, temos nossa inserção na cesta de compras pronta.
Cc518027.artigo01012006-11(pt-br,MSDN.10).jpg
(Tela do wizard de configuração do sqlDataSource, na qual chegamos pela smartTag deste objeto - "configure datasource")
Uma questão importante a definir é o que usar como identificador do usuário. Antigamente utilizavamos o código de sessão concatenado com algo mais para se tornar um identificador de usuário.
Uma das novidades do .NET 2.0 é que não precisamos mais disso. Quando o usuário está logado o identificador dele é o login. Quando não está o .NET cria para o usuário um identificador anônimo, que servirá como identidade anônima do usuário.
A identidade anônima, porém, precisa ser habilitada no web.config. Veja como fica :
<anonymousIdentification enabled="true" />
Neste exemplo a identidade anônima será mantida na forma de um cookie. Porém temos também a opção de desativar o uso de cookies. Neste caso a identidade do usuário, quando gerada, passa a trafegar pela URL requisitada pelo usuário. Veja um exemplo :
<anonymousIdentification enabled="true" cookieless ="AutoDetect" />
A opção cookieLess, que existe também em outras tags além desta, aceita os seguintes valores :
AutoDetectDetectar automaticamente se o client aceita cookies. O ASP.NET tenta fazer o envio de um cookie para descobrir isso
UseCookiesUtilizar cookies
UseDeviceProfileUtilizar a identificação (profile) do browser client para determinar quando devem ou não ser utilizados cookies. Esses profiles também podem ser configurados no web.config
UseURIUtilizar a URL para transmitir a identificação do usuário, não usar cookies
Por fim, precisamos apenas garantir que o campo IdUsuario seja preenchido quando o update ocorrer. Para isso vamos utilizar um evento da gridView, rowUpdating . Veja como fica :
Cc518027.artigo01012006-19(pt-br,MSDN.10).jpg
(Utilize a janela de propriedades para programar o evento)
Observe o uso da propriedade AnonymousID, no objeto Request, para recuperar o ID anônimo do usuário gerado pelo ASP.NET .Com isso nossa inserção na cesta de compras já estará funcionando.

Página de cesta de compras

Primeiro Passo : Criar o SQL DataSource
Teremos 3 atividades de banco nesta página : Ler as informações da cesta de compras, alterar a quantidade na cesta de compras e eliminar uma quantidade da cesta de compras.
Assim sendo nosso SQL DataSource deverá estar configurado com uma instrução SELECT, uma instrução UPDATE e uma instrução DELETE.
Cc518027.artigo01012006-13(pt-br,MSDN.10).jpg
(Tela de configuração do sqlDataSource - pela qual já haviamos passado anteriormente)
A instrução SELECT precisará trazer o cálculo de total do item comprado pelo usuário . Além disso a instrução SELECT precisa de um parâmetro, a identificação do usuário, de forma que traga apenas os pedidos de um usuário específico.
Cc518027.artigo01012006-14(pt-br,MSDN.10).jpg
Cc518027.artigo01012006-15(pt-br,MSDN.10).jpg
Observem que tanto a instrução de UPDATE como a instrução de DELETE utilizam como argumento o id do usuário e o id do produto, afinal ambos são a chave da tabela.
Segundo Passo : Configurar a gridView
Vincular a gridView com o dataSource é um passo muito simples. Mas o dataSource precisa de um parâmetro para exibir os dados, a identificação do usuário. Assim sendo precisaremos programar o evento Selecting do dataSource para garantir a exibição correta dos dados.
Cc518027.artigo01012006-20(pt-br,MSDN.10).jpg
(Utilize a janela de propriedades para programar o evento Selecting)
O id do produto e o identificador do usuário são as chaves desta tabela cesta, você precisa garantir que estejam definidos na propriedade DataKeyNames da gridView. Mais um de nossos truques.
Terceiro Passo : Calcular o total
O usuário pode ter adquirido muitos produtos, então deveremos fazer o cálculo de total dos produtos adquiridos. Para isso devemos programar o evento rowDataBinding da gridView.
Cc518027.artigo01012006-21(pt-br,MSDN.10).jpg
(Utilize a janela de propriedades para programar o evento RowDataBound)
Além disso precisaremos de um local para inserir o total. Devemos então alterar a propriedade showFooter para podermos exibir o rodapé da gridView.
Cc518027.artigo01012006-16(pt-br,MSDN.10).jpg
Quarto Passo : Configurar a alteração de quantidade
Precisaremos de uma caixa de texto, validadores (required, compare e summary), um imageButton e mais uma vez faremos uso do truque do validationGroup, vinculado com o código de produto.
Tudo acaba sendo identico ao que fizemos na gridview anterior. Mas como desta vez temos os dois campos que precisamos definidos como dataKeys da gridview, não precisaremos codificar nada.
Cc518027.artigo01012006-17(pt-br,MSDN.10).jpg
(Resultado da gridView na página de cesta de compras - já com a atualização de dados)
Quinto Passo : Configurar a deleção de um item da gridView
Precisaremos de mais uma coluna, uma ButtonColumn. Vamos adicionar adicionar a coluna e configura-la com o commandName Delete. A gridView junto com o sqlDataSource fará o resto para nós.
Cc518027.artigo01012006-18(pt-br,MSDN.10).jpg


Sem comentários:

Enviar um comentário