Repeater no GASweb Por: Rodrigo Silva O controle de servidor Repeater é um container básico que permite a você criar uma lista de qualquer informação que deseja em uma página Web. Ele não tem uma aparência definida, é você que molda o layout do controle usando outros controles ASP.NET. Quando você executa a página o controle Repeater faz uma interação através dos dados na fonte de dados e renderiza um item para cada dado. Para usar o controle Repeater você cria regiões que definem o layout do conteúdo do controle. Estas regiões podem conter qualquer combinação válida de texto Html e controles na página web. Se você não definir nenhuma região ou as regiões não contiverem elementos, ele não vai ser visível na página. O Repeater, apesar de ser simples, tem uma série de complicações no seu uso, desde o click, que usa algum parâmetro específico da linha clicada, até paginação, fazendo o Select no banco de dados apenas nos registros requisitados pelo controle de paginação. No GASweb, com sua rica interface e controles, você pode criar as regiões do seu Repeater de forma fácil, bem como fazer sua interação com o banco de dados e paginação. Além de separar a parte de cliente (design de controles) e o código de servidor (binding dos campos que serão apresentados nos Repeaters), evitando assim código c# em sua pagina ASPX. Regiões O Repeater no GASweb tem 4 partes que você pode definir seus layouts. Header Ficará na parte de cima da lista, não se repetirá. Body e Alternating Apresentará todos os registros da sua tabela ou view, revezando entre body e alternating. Footer Ficará na parte inferior da lista, não se repetirá. Abaixo um exemplo de como se define o Repeater no GASweb. Nível - Intermediário 1/8
Imagem do projeto gerado: Repeater Pager Quando temos um número muito elevado de registros no banco, pode causar lentidão se tentarmos pegar e mostrar todos os registros de uma só vez. Por isso, existe o Repeter pager, para paginar os registros fazendo que mostre apenas um número limitado de linhas no Repeater. Como fazer um Repeater pager no asp.net? Primeiramente criar os botões da para paginar os registros: <asp:panel id="grepeaterpager1" runat="server" horizontalalign="left" style="position: absolute; left: 114px; top: 24px; width: 230px; height: 30px; background-color: Transparent; border-color: #000000; border-style: None; border-width: 0"> <asp:button id=" GRepeaterPager1 Button1" runat="server" commandname="button1" <asp:button id=" GRepeaterPager1 Button2" runat="server" commandname="button2" <asp:button id=" GRepeaterPager1 Button3" runat="server" commandname="button3" <asp:button id=" GRepeaterPager1 Button4" runat="server" commandname="button4" <asp:button id=" GRepeaterPager1 Button5" runat="server" commandname="button5" 2/8
<asp:button id=" GRepeaterPager1 Button6" runat="server" commandname="button6" <asp:button id=" GRepeaterPager1 Button7" runat="server" commandname="button7" <asp:button id=" GRepeaterPager1 Button8" runat="server" commandname="button8" <asp:button id=" GRepeaterPager1 Button9" runat="server" commandname="button9" </asp:panel> Depois criamos uma propriedade para manter a página clicada: public int GRepeater1_PageNumber get if (ViewState["GRepeater1_PageNumber"]!= null) return (int)viewstate["grepeater1_pagenumber"]; return 0; set ViewState["GRepeater1_PageNumber"] = value; Depois é feito o click dos botões setando a página, de acordo com o botão clicado: public void GRepeaterPager1 Click(object sender, EventArgs e) switch (((Button)sender).CommandArgument.ToUpper()) case "F": GRepeater1_PageNumber = 0; case "P": if (GRepeater1_PageNumber > 0) GRepeater1_PageNumber--; case "N": GRepeater1_PageNumber++; case "L": GRepeater1_PageNumber = -1; default: int Num; if (int.tryparse(((button)sender).commandargument, out Num)) GRepeater1_PageNumber = Num; 3/8
E na hora de fazer o select no banco, chama uma classe estática que controla os registros selecionados: GRepeater1.DataSource = RepeaterPagerControler.ControlPagesButtons(GRepeaterPager1, 5, 10, ref GRepeater1_PageNumber, true, true, PageProvider.GRepeater1RepeaterProvider.SelectAllItems().Tables[0].Rows); E no GASweb como é feito? Arraste o pager para a tela: Diga o numero de registros que deseja mostrar por página e se quer os botões de primeiro e último e próximo e anterior: E por ultimo diga ao Repeater qual o pager será utilizado por ele Pronto! Seu Repeater já estará paginando normalmente. Lembrando que você pode customizar os botões do pager através da property grid do GASweb. Ações de servidor Ao listar os itens de um Repeater, muitas vezes vemos a necessidade de utilizar ações que utilizem campos do registro que foram clicados, coisa que o Repeater por si só não oferece. O que acontece é que ao fazer a requisição de servidor, o datasource do Repeater é zerado, fazendo com que não seja possível utilizar a mesma base, onde temos apenas o id da linha selecionada. 4/8
E por que não refazer o select e utilizar o id da linha para pegar o registro selecionado? Ao fazer isto você não terá a mesma base que teria antes e isso pode acarretar problemas, pois o banco de dados pode ter sido mudado por outros usuários do sistema, fazendo com que aconteça de não haver o registro ou o registro ser diferente do originalmente clicado. E como resolver isto? Primeiramente, quando carregar os registros do banco, iremos armazenar em ViewState o Index da linha, associado com um campo chave do registro no banco, para podermos fazer select nele pelo campo do index, mantendo assim fiel ao registro clicado. A função Databind será chamada para cada linha do Repeater, então neste ponto ligaremos o index da linha com o index do campo do banco: DataRow row = e.item.dataitem as DataRow; if(row!= null) GRepeater1Index[e.Item.ItemIndex] = "Nome=" + row["nome"].tostring(); Onde Nome é o nome do campo que será o index do banco. Com isso teremos uma lista com todas as linhas e filtros para funcionar nela. Para que ela não seja apagada precisamos guardar ela em viewstate: public Hashtable GRepeater1Index get if (ViewState["GRepeater1Index"]!= null) return (Hashtable)ViewState["GRepeater1Index"]; return null; set ViewState["GRepeater1Index"] = value; Após o click, o index vai vir através do eventargs do post como mostrado: Control TargetControl = this.findcontrol(request[" EVENTTARGET"].Replace(':', '$')); if (((RepeaterItem)TargetControl.BindingContainer).ItemIndex >= 0) GRepeater1ProviderSinc(((RepeaterItem)TargetControl.BindingContainer).ItemIndex); 5/8
E a função que sincroniza a tabela do repater com o item clicado: public void GRepeater1ProviderSinc(int LineIndex) Dictionary<string, object> Values = new Dictionary<string, object>(); string[] splittedvals = GRepeater1Index[LineIndex].ToString().Split(' '); foreach(string Val in splittedvals) Values.Add(Val.Substring(0, Val.IndexOf("=")), Val.Substring(Val.IndexOf("=") + 1)); PageProvider.GRepeater1RepeaterProvider.FindRecord(Values); Depois disso, no item da tabela do Repeater, estarão os dados do item clicado: PageProvider.GRepeater1RepeaterProvider.Item Podendo ser usado para click: Response.Redirect("DataPage.aspx?NOME=" + (Convert.ToString(PageProvider.GRepeater1RepeaterProvider.Item["Nome"].GetValue())).ToStrin g()); E no GASweb? No GASweb já está pronto. Você pode apenas criar a sua action em algum evento dos controles colocados dentro do Repeater e utilizar os parâmetros da tabela do Repeater. Utilizando Repeater como grid no GASweb Você pode utilizar o Repeater para simular um GRID e customizar as ações de INSERT,UPDATE e DELETE. Veja abaixo como podemos fazer isso. Como fazer a Exclusão: Basta colocar um botão no corpo do Repeater, colocar uma action customizada no click do botão e colocar o seguinte código C#: ViewState["OldParameters"] = null; PageProvider.GRepeater1RepeaterProvider.DeleteItem(PageProvider.GRepeater1RepeaterProvider. Item); Onde GRepeater1 é o nome do seu Repeater. 6/8
Como fazer a Inclusão: Nas propriedades da p sgina de dados todas essas propriedades devem estar marcadas. Crie um parâmetro de query string onde você passará o campo Index da página. Faça um filtro inicial na pagina de acordo com o seu index. =([AUX_Rep].[Nome] = NOME) O filtro serve para que quando o parâmetro passado seja ou não exista, a página venha em modo de inclusão. Caso seja algum valor de registro existente, ela vem em modo de edição. Coloque na página os campos do banco desejados e coloque um botão de salvar Pronto! Lembrando que desse modo, você pode criar suas tabelas auxiliares a vontade, podendo criar processos e lançamentos da mesma maneira que você faria no grid. Como fazer a Edição: Coloque um botão no corpo do repeater para edição, e no click do botão faça uma navegação para a mesma página passando como parâmetro o Campo que é index da sua tabela. E por último, colocar o evento de navegação para a própria página ao término do save para o não ter mais filtro ativo. 7/8
Como vocês podem ver, criar um Repeater no GASweb é muito mais fácil do que cria-lo no Visual Studio. Pois o GASweb tem uma interface rica de controles e propriedades que auxiliam na criação das regiões do repeater. No próximo artigo vamos mostrar como criar uma aplicação multiempresa no GASweb. 8/8