Skip Navigation Links



Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de UsuĆ”rios
»CĆ©lulas AcadĆŖmicas«
intcontpiada : 118
Suporte TĆ©cnico
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
FaƧa um pequeno teste com 10 questƵes de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programaĆ§Ć£o com nosso treinamento on-line de lĆ³gica de programaĆ§Ć£o
.:.
Veja nosso calendƔrio de treinamentos
Gostou da PƔgina?
Então

para um amigo!

Pesquisa personalizada
Pesquisar Dicas:

 







Truques com user controls e WebParts

Vamos criar um projeto para testar alguns truques com user controls, webParts e formView.

Este projeto pode ser visto como um complemento para o projeto de uma cesta de compras em http://www.bufaloinfo.com.br/artigos/artigo01012006.asp A única diferença (exigindo uma pequena adaptação para unir os dois projetos) é a tabela cesta, que neste projeto possui um campo adicional, PUnit.

Neste projeto vamos criar uma página principal de um site de vendas. Nesta página principal mostraremos promoções diversas, uma promoção para cada categoria de produto. Vamos permitir que o usuário possa alterar as categorias de promoções que são exibidas conforme sua preferência.

Além disso permitiremos que um administrador possa definir as promoções que serão exibidas por default na página, definindo assim uma visualização padrão para todos os usuários.

Veja como fica a tabela de promoções :

Na página principal desejaremos inserir várias promoções diferentes e de forma bem versátil, então a melhor forma será criar um webUserControl para a exibição de promoções. Este será o próximo passo.

1a Etapa : Criar o user control

Vamos primeiramente criar e testar nosso user control. O user control deverá ir ao banco e consultar as promoções para uma determinada categoria, exibindo os detalhes da promoção.

O user control precisará ter uma propriedade idCategoria para identificar a categoria da promoção que será exibida. Assim o user control será parametrizado, quem for utiliza-lo poderá definir de qual categoria será a promoção exibida.

Veja como fica a definição da propriedade :

   45     Public Enum eCategoria

   46         Bevereages = 1

   47         SeaFood = 8

   48         Condiments = 2

   49         Produce = 7

   50         Confections = 3

   51         Meat = 6

   52         Cereals = 5

   53         DairyProducts = 4

   54     End Enum

   55 

   56     Dim vCategoria As eCategoria = 1

   57 

   58     <WebBrowsable(), Personalizable()> _

   59     Public Property Categoria() As eCategoria

   60         Get

   61             Return (vCategoria)

   62         End Get

   63         Set(ByVal value As eCategoria)

   64             vCategoria = value

   65         End Set

   66     End Property

 

Obseve os atributos inseridos na propriedade Categoria :

WebBrowsable : Faz com que o atributo fique visível para exibição web, como no propertygridEditor.

Personalizable : Faz com que o atributo seja personalizável, permitindo que cada usuário possa manter seu próprio valor para esta propriedade, sem programação adicional.

 

Precisaremos então criar um SQLDataSource para buscar os dados da promoção. A propriedade será utilizada como parâmetro do SQL Data Source. Veja como fica a query :

Ao definir os parâmetros, definimos o parâmetro como "None", para podermos atribuir seu valor via código. Iremos então programar o evento Selecting do datasource de forma a atribuir o valor do parâmetro.

Veja como fica o código do evento selecting :

   69     Protected Sub SqlDataSource1_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataSource1.Selecting

   70 

   71 

   72         e.Command.Parameters("@Categoria").Value = Categoria

   73     End Sub

Para que seja possível exibir os dados diretamente a partir do SQLDataSource vamos fazer uso de um formView. O formView, além de nos permitir exibir as informações, nos permite fazer a montagem de um layout flexivel, que é o que precisaremos nesse caso.

Mas devemos prever desde já o passo seguinte : A promoção que iremos exibir deverá possuir um link "comprar agora" que irá inserir o produto na cesta de compras.

Ao contrário de outros objetos, o formView não obedece ao commandName caso não esteja no modo apropriado. Então se utilizarmos o formView em seu modo padrão teremos o trabalho de programar toda a inclusão na cesta.

Mas se alterarmos o modo de exibição do formView podemos fazer com que o formView dispare a inclusão na cesta automaticamente para nós. Não podemos utilizar o modo de insert, pois ele não buscaria os dados iniciais da promoção para exibir, então devemos utilizar o modo de edição. Ele vai buscar os dados da promoção e o click no link fará com que execute a gravação da edição. A questão é que como instrução para gravação da edição podemos inserir qualquer coisa, inclusive um insert na tabela cesta.

Vamos então criar o DataSource a query de update, que na verdade será um insert na tabela cesta.

A forma natural de garantirmos o preenchimento dos parâmetros deste insert seria através do two-way databinding, ou seja, a instrução Bind ao vincular os campos do dataSource na tela para exibir os dados.

Porém esse vinculo envolve também formatação, como no caso do preço que vamos desejar formatar em reais. Essa formatação prejudica a gravação dos dados, misturando tipos de dados e exigindo conversões em locais complexos.

Considerando o fato que os dados em momento algum serão editados, apenas exibidos e posteriormente gravados em outra tabela, temos então uma outra alternativa : incluir os campos na coleção DataKeys. Desta forma os valores gravados não passarão por transformações e formatações, resolvendo nosso problema.

O próximo passo é criar o link para a realização da compra. O único truque especial neste linkButton é o CommandName que deve ser especificamente Update, exatamente para disparar o update no formView.

Precisaremos ainda programar o preenchimento do campo com o id do usuário, teremos que fazer isso no evento updating. O usuário pode estar logado ou não e a forma de recuperar o id do usuário em cada caso é diferente. Portanto vamos criar uma função para isso.

Veja como fica :

   80     Protected Sub SqlDataSource1_Updating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles SqlDataSource1.Updating

   81 

   82 

   83         e.Command.Parameters("@idUsuario").Value = usuario()

   84         response.redirect("cesta.aspx")

   85     End Sub

   86 

   87     Private Function usuario() As String

   88         If Context.User.Identity.IsAuthenticated Then

   89             Return (Context.User.Identity.Name)

   90         Else

   91             Return (Request.AnonymousID)

   92         End If

   93     End Function

2o Passo - Configurar a página principal

Iremos inserir na página principal não apenas um, mas vários destes user controls que acabamos de criar. Para permitirmos ao usuário personalizar os user controls vamos fazer a inserção na forma de webParts. Veja como fica :

1) Precisamos de um webPartManager para controlar o status das WebParts

2) Vamos criar uma tabela com 4 colunas

3) Em cada uma das 3 primeiras colunas vamos inserir um webPartZone

4) Em cada webPartZone vamos inserir um de nossos webUserControls

5) Entrando no HTML, vamos dar um titulo (title) para cada um de nossos webUserControls

6) Na 4a coluna vamos inserir uma editorZone

7) Dentro da EditorZone vamos inserir um PropertyGridEditor

A edição dos controles será feita com base na propriedade que eles possuem para indicar qual a categoria da promoção que será exibida. Por isso utilizaremos o PropertyGridEditor, que exibe as propriedades dos controles nas webPartZones.

3a Etapa - Autenticação

Para que todo esse cenário possa funcionar é necessário habilitarmos a autenticação na página. As webParts não permitem ser personalizadas se a autenticação não for habilitada e um usuário estiver logado.

Os usuários poderão visualizar a página quer estejam ou não autenticados, mas apenas poderão personalizar a página caso estejam autenticados. Desta forma o ideal será utilizarmos um loginView nesta página.

O loginView possui dois templates, um para quando o usuário está logado e outro para quando não está. Assim sendo quando o usuário não estiver logado poderemos exibir o controle de login, quando estiver podemos exibir, além do nome do usuário e uma opção de logoff, opções para personalizar a página.

Observando que para que tudo isso funcione precisaremos configurar adequadamente os providers de Membership e Roles no web.config. Sobre essa configuração você pode ler um pouco mais em http://www.bufaloinfo.com.br/artigos/coluna32.asp

 

Após o usuário realizar seu login, o loginView substitui o controle de login por dados do usuário (porque assim foi configurado) e um linkbutton "Personalize esta página". O ideal é que este linkButton seja tipo on/off, mudando o estado de personalização do webPartManager. Veja como fica o código para fazer isso :

 

   96     Protected Sub lnkPersonalizar_Click(ByVal sender As Object, ByVal e As System.EventArgs)

   97 

   98         If WebPartManager1.DisplayMode Is WebPartManager.BrowseDisplayMode Then

   99 

  100 

  101             WebPartManager1.DisplayMode = WebPartManager.EditDisplayMode

  102 

  103 

  104             sender.text = "Visualização normal"

  105         Else

  106             WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode

  107 

  108 

  109             sender.text = "Personalizar esta página"

  110         End If

  111     End Sub

Quando, após entrar em modo de personalização, o usuário seleciona a instrução "Edit" no menu, a Editor Zone é exibida e o PropertyGridEditor faz seu trabalho permitindo a alteração do valor das propriedades marcadas como WebBrowsable() (uma, em nosso caso). Porém a alteração da propriedade não tem um efeito imediato. É necessário um "refresh" no formView para gerar um efeito imediato em nosso user control, para isso precisaremos utilizar um truque, cuidadosamente :

  113     Dim binicializando As Boolean = True

  114 

  115     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  116 

  117 

  118         binicializando = False

  119     End Sub

  120 

  121     <WebBrowsable(), Personalizable()> _

  122     Public Property Categoria() As eCategoria

  123         Get

  124             Return (vCategoria)

  125         End Get

  126         Set(ByVal value As eCategoria)

  127             vCategoria = value

  128             If Not binicializando Then

  129                 FormView1.DataBind()

  130             End If

  131         End Set

  132     End Property

 

A variável binicializando apenas recebe false no page_load, quando todos os objetos já foram inicializados. No Set da propriedade testamos essa variável. Se a propriedade estiver sendo alterada após a inicialização então fazemos um dataBind, pois trata-se de uma personalização. Caso contrário não fazemos, pois trata-se da inicialização normal e forçar o dataBind no formView geraria erro.

4a Etapa - Personalização Global

Agora que cada usuário já pode personalizar sua própria visualização, o próximo passo é permitir que o administrador personalize a visualização padrão dos usuários anônimos.

O webPartManager permite realmente duas formas de visualização das webparts : User ou Shared. O modo Shared tipicamente só é exibido para usuários que não possuem personalizações em suas exibições, é, enfim, uma exibição default.

É possível para um usuário mudar de uma visualização para outra, User para Shared ou vice-versa, mas por questão de segurança é necessária uma permissão específica para este tipo de mudança na visualização. As permissões padrões estão definidas no web.config global (framework\(versao)\config), mas podemos altera-las em nosso próprio web.config.

Veja como fica a configuração permitindo que membros do grupo Admins (definição do roles provider) possa mudar de um modo de visualização para outro :

Feito isso vamos criar mais um linkButton para alternar entre o modo User e Shared, esse linkButton deverá estar apenas visível para administradores. Veja como fica o código deste linkButton :

 

  134     Protected Sub lnkGlobal_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkGlobal.Click

  135 

  136         WebPartManager1.Personalization.ToggleScope()

  137     End Sub

  138 

  139     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  140 

  141         If WebPartManager1.Personalization.Scope = PersonalizationScope.User Then

  142             lnkGlobal.Text = "Visualização Global"

  143 

  144         Else

  145             lnkGlobal.Text = "Visualização Pessoal"

  146 

  147         End If

  148         lnkGlobal.visible = context.user.isinrole("Admins")

  149     End Sub

 

 

O método ToggleScope provoca uma interrupção e um reinicio do processamento da página, por isso processamentos adicionais, tal como a mudança do text do linkButton, precisam estar separados em pontos distintos, dai que o Page_Load é um bom local para configurar o linkButton.

 

Observe ainda a configuração do visible do linkButton, para que este só apareça para os administradores.

 

Conclusão

 

Com este artigo vimos mais uma série de truques com formView, userControls e WebParts

 

 

Dennes Torres
MCAD,MCSD,MCSE,MCDBA

 

 





Envie seus comentįrios sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentįrios nesta pįgina

Veja abaixo os comentários já enviados :

Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : adidas ultra boost uncaged E-Mail : dcygtljmxij@gmail.com
You made some first rate points there. I seemed on the internet for the difficulty and found most individuals will associate with with your website.
adidas ultra boost uncaged https://is.gd/FcZWwu
Nome : adidas ultra boost E-Mail : mplkvtp@gmail.com
I must show some appreciation to this writer for bailing me out of this predicament. After checking throughout the world-wide-web and obtaining tricks which were not helpful, I believed my entire life was done. Existing without the presence of approaches to the issues you've solved as a result of your main short post is a serious case, and those that would have negatively damaged my entire career if I hadn't discovered your website. Your personal understanding and kindness in dealing with all the details was very helpful. I am not sure what I would've done if I had not discovered such a thing like this. It's possible to at this point relish my future. Thanks very much for your impressive and effective help. I won't be reluctant to suggest your blog to anybody who desires guidelines on this area.
adidas ultra boost https://v.gd/geigRX
Nome : detroit lions jerseys E-Mail : lfbkzrly@gmail.com
I not to mention my buddies have been taking note of the best items from the blog then instantly came up with a horrible feeling I had not expressed respect to the web site owner for those secrets. Most of the people were consequently glad to learn all of them and have now extremely been having fun with those things. I appreciate you for turning out to be simply considerate and for picking out this form of essential issues most people are really eager to know about. Our sincere apologies for not saying thanks to you sooner.
Nome : coach factory outlet E-Mail : zbmxzlhzuz@gmail.com
I precisely desired to say thanks yet again. I do not know what I would've done in the absence of the actual creative concepts revealed by you about my field. This was a frustrating matter in my position, nevertheless witnessing a new professional mode you treated that took me to jump with contentment. I am just happier for your work as well as wish you find out what a great job that you're doing teaching many others thru your webpage. I know that you've never met any of us.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Conheça mais sobre o nosso site :

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



Quer saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e
Prepare-se para o Mercado!
Veja o que a Búfalo tem para você.

ļæ½ BĆŗfalo InformĆ”tica, Treinamento e Consultoria - Rua Ɓlvaro Alvim, 37 Sala 920 - CinelĆ¢ndia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br