Dev (Back & Front)ARTIGO

Realizando a manutenção de dados com o controle Repeater

Lá vamos
nós! Voltamos a abordar o controle Repeater, e desta vez para mostrar
como realizar as operações de inclusão, alteração e
exclusão no controle em uma aplicação ASP.NET, usando o Visual
Web Developer 2010 Express Edition
.

Este
controle teve grande parte de suas funcionalidades
absorvidas pelos novos controles GridView, DetailsView, e FormView na ASP.NET 2.0, por isso vou apresentar o
controle presente na nova versão por questões de
compatibilidade.

O controle Repeater
é identificado pela tag <asp:Repeater></asp:Repeater>,
e exibe uma lista repetida de
itens a ele vinculados, podendo ser usado para exibir registros de
fonte de dados diversas. O controle está baseado na
utilização de templates que são modelos para exibição
de saída, usando expressões de vinculação, controles de
servidor e tags XHTML que estruturam a exibição dos dados. A
sub tag <ItemTemplate> é usada no interior da tag
do controle, com o bloco de código para renderizar os itens de
dados que serão exibidos no controle.

Antes de
criarmos o projeto vamos definir o banco de dados que iremos usar
no exemplo. Será algo bem simples.

Abaixo temos a
estrutura da tabela Lista do banco de dados Escola.mdf criado no
SQL Server 2008 Express:

Vamos tratar
apenas os campos id, nome e curso, usando o controle Repeater.

Agora abra o Visual
Web Developer 2010 Express e no menu File
selecione New Web Site. Em seguida, selecione o template ASP.NET Empty Web Site,
usando a linguagem Visual Basic, e informe o
nome RepeaterCRUD , depois clique em OK.

Vamos incluir um WebForm
no projeto. No menu WebSite selecione Add
New Item
e depois selecione o template Web Form,
aceitando o nome Default.aspx e clicando em Add;

A string de conexão do banco de
dados esta presente no arquivo Web.Config e esta
assim definida:

 <appSettings><br />    <add key="ConnectionString" value="Data Source=.\SQLEXPRESS;Initial Catalog=Escola;Integrated Security=True"/><br />  </appSettings>

Vamos definir a interface usando o controle Repeater na
página Default.aspx, conforme a imagem a seguir:

Estamos usando os seguintes
controles nesta página:

  • Repeater – ID=
    cpRepeater
  • CheckBox – ID=
    chkDeletar
  • DropDownList –
    ID = ddlCurso
  • 5 LinkButton –
    IDs = lnkEditar, lnkAtualizar, lnkCancelar, lnkDeletar,
    lnkDelSelecionado

O código fonte da página (logo abaixo) deve ser colocado entre as tags <div> da
página Default.aspx:

 <asp:Repeater ID="cpRepeater" runat="server" onitemcommand="cpRepeater_ItemCommand" <br />            onitemdatabound="cpRepeater_ItemDataBound"><br />        <HeaderTemplate><br />        <table width="500px" border="1px"><br />        <tr style="background-color:#99CCFF"><br />        <td >Email</td><br />        <td >Aluno</td><br />        <td >Curso</td><br />        <td >Opções</td><br />        </tr><br />        </HeaderTemplate><br /><br />        <ItemTemplate><br />        <tr style="background-color:#ffffff"><br />        <td ><br />         <asp:CheckBox ID="chkDeletar" runat="server" /><br />        </td><br />        <td ><br />            <asp:Label ID="lblid" Visible="false" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "id") %>'></asp:Label><br />            <asp:Label ID="lblNome" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "nome")%>'></asp:Label><br />            <asp:TextBox ID="txtNome" BackColor="#d4d0c8" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "nome")%>' Visible="false"></asp:TextBox><br />         </td><br />         <td><br />            <asp:DropDownList ID="ddlCurso" runat="server"><br />            </asp:DropDownList><br />         </td><br />         <td ><br />            <asp:LinkButton ID="lnkEditar" runat="server" CommandName="edit" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Editar</asp:LinkButton><br />            <asp:LinkButton Visible="false" ID="lnkAtualizar" runat="server" CommandName="update" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Atualizar</asp:LinkButton><br />            <asp:LinkButton Visible="false" ID="lnkCancelar" runat="server" CommandName="cancel" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Cancelar</asp:LinkButton><br />            <asp:LinkButton ID="lnkDeletar" runat="server" CommandName="delete" OnClientClick='javascript:return confirm("Confirma a exclusão deste registro ?")' <br />            CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Deletar</asp:LinkButton><br />        </td><br />        </tr><br />        </ItemTemplate><br />        <FooterTemplate><br />           <tr style="background-color:#15880a"><br />           <td colspan="5"><br />        </FooterTemplate><br />        </asp:Repeater><br />        <asp:LinkButton ID="lnkDelSelecionado" ForeColor="White" runat="server" onclick="LinkButton1_Click" <br />OnClientClick='javascript:return confirm("Confirma exclusão do registro selecionado?")'>Deletar Selecionado</asp:LinkButton>

Observe que estamos usando
os templates: HeaderTemplate, ItemTemplate e
FooterTemplate.

Além disso, usamos também JavaScript
para solicitar a confirmação da exclusão do registro, usando o
evento OnClientClick:

OnClientClick=’javascript:return
confirm(“Confirma a exclusão deste registro ?”)’

Agora vamos ao
código da aplicação, que será colocado no arquivo code-behind Default.aspx.vb:

Vamos começar
definindo os namespaces usados no código:

  • Imports System.Data
  • Imports System.Data.SqlClient
  • Imports System.Web.UI
  • Imports System.Web.UI.WebControls


Para exibir os
registros na página colocaremos no evento Load
da página a chamada da rotina VincularRepeater(),
que após verificar se não é um postback irá acessar a tabela Lista
e vincular os registros ao controle cpRepeater:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load<br />        If Not IsPostBack Then<br />            VinculaRepeater()<br />        End If<br />    End Sub

O código da rotina VinculaRepeater()
é dado logo abaixo onde ela obtém a string de conexão do arquivo de
configuração e cria um dataset com os dados da tabela Lista:

 Private Sub VinculaRepeater()<br />        Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))<br />        Dim SqlCmd As New SqlCommand("select * from Lista", SqlCnn)<br />        Dim Sqlda As New SqlDataAdapter(SqlCmd)<br />        Dim ds As New DataSet()<br />        Sqlda.Fill(ds, "Lista")<br />        cpRepeater.DataSource = ds<br />        cpRepeater.DataBind()<br />    End Sub

O evento ItemCommand,
do controle Repeater, corre quando um botão é clicado no
controle Repeater, e estamos usando o evento para
tratar as interações do usuário com os links para editar e
deletar registros da página ASP.NET.

Usamos o o método FindControl
para pequisar um controle do servidor usando um parâmetro id
especificado.

 Protected Sub cpRepeater_ItemCommand(ByVal source As Object, ByVal e As RepeaterCommandEventArgs) Handles cpRepeater.ItemCommand<br /><br />        Dim lnkAtualizar As LinkButton = DirectCast(e.Item.FindControl("lnkAtualizar"), LinkButton)<br />        Dim lnkCancelar As LinkButton = DirectCast(e.Item.FindControl("lnkCancelar"), LinkButton)<br />        Dim lnkEditar As LinkButton = DirectCast(e.Item.FindControl("lnkEditar"), LinkButton)<br />        Dim lnkDeletar As LinkButton = DirectCast(e.Item.FindControl("lnkDeletar"), LinkButton)<br />        Dim lblNome As Label = DirectCast(e.Item.FindControl("lblNome"), Label)<br />        Dim lblrptID As Label = DirectCast(e.Item.FindControl("lblid"), Label)<br />        Dim txtNome As TextBox = DirectCast(e.Item.FindControl("txtNome"), TextBox)<br />        Dim ddlCurso As DropDownList = DirectCast(e.Item.FindControl("ddlCurso"), DropDownList)<br />        Dim chkDeletar As CheckBox = DirectCast(e.Item.FindControl("chkDeletar"), CheckBox)<br /><br />        If e.CommandName = "edit" Then<br />            lnkCancelar.Visible = True<br />            lnkAtualizar.Visible = True<br />            lnkEditar.Visible = False<br />            txtNome.Visible = True<br /><br />            lblNome.Visible = False<br />        End If<br /><br />        If e.CommandName = "cancel" Then<br />            VinculaRepeater()<br />        End If<br /><br />        If e.CommandName = "update" Then<br />            Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))<br />            Dim SqlCmd As New SqlCommand("update Lista set nome=@Nome, curso=@Curso where id=@ID", SqlCnn)<br />            SqlCmd.Parameters.Add("@nome", SqlDbType.VarChar).Value = txtNome.Text<br />            SqlCmd.Parameters.Add("@curso", SqlDbType.VarChar).Value = ddlCurso.SelectedItem.Text<br />            SqlCmd.Parameters.Add("@id", SqlDbType.VarChar).Value = e.CommandArgument<br />            Try<br />                SqlCnn.Open()<br /><br />                SqlCmd.ExecuteNonQuery()<br />            Catch ex As Exception<br />                ex.Message.ToString()<br />            Finally<br />                If SqlCnn.State = ConnectionState.Open Then<br />                    SqlCnn.Close()<br />                End If<br />            End Try<br />            VinculaRepeater()<br />        End If<br />        If e.CommandName = "delete" Then<br />            Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))<br />            Dim SqlCmd As New SqlCommand("delete Lista where id=@ID", SqlCnn)<br />            SqlCmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = e.CommandArgument<br />            Try<br />                SqlCnn.Open()<br /><br />                SqlCmd.ExecuteNonQuery()<br />            Catch ex As Exception<br />                ex.Message.ToString()<br />            Finally<br />                If SqlCnn.State = ConnectionState.Open Then<br />                    SqlCnn.Close()<br />                End If<br />            End Try<br />            VinculaRepeater()<br />        End If

No evento ItemDataBound,
do controle Repeater, é disparado a cada vez que um registro é
incluído no controle. Dessa forma, com esse evento podemos
acessar os controles que são criados, bem como os dados que
estão sendo vinculados as linhas e isso permite que você faça
uma variedade de ações com esse evento como alterar dados,
popular controles, etc.

No código do nosso exemplo estamos
acessando a tabela Lista, criando um dataset e
preenchendo o controle DropDownList (ddlCurso):

Protected Sub cpRepeater_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs) Handles cpRepeater.ItemDataBound<br /><br />        Dim ddlCurso As DropDownList = DirectCast(e.Item.FindControl("ddlCurso"), DropDownList)<br /><br />        If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then<br />            Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))<br />            Dim SqlCmd As New SqlCommand("select * from Lista", SqlCnn)<br />            Dim Sqlda As New SqlDataAdapter(SqlCmd)<br />            Dim ds As New DataSet()<br />            Dim dt As New DataTable()<br />            Sqlda.Fill(dt)<br />            ddlCurso.DataTextField = "Curso"<br />            ddlCurso.DataSource = dt<br />            ddlCurso.DataBind()<br />            ddlCurso.SelectedValue = DataBinder.Eval(e.Item.DataItem, "curso").ToString()<br />        End If<br />    End Sub

No evento Click do
linkButton – Deletar Selecionado – verificamos se o checkbox está
marcado para o registro e o excluímos da tabela em caso
positivo:

Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkDelSelecionado.Click<br />        For Each Item As RepeaterItem In cpRepeater.Items<br />            Dim chkDeletar As CheckBox = DirectCast(Item.FindControl("chkDeletar"), CheckBox)<br />            Dim lblrptID As Label = DirectCast(Item.FindControl("lblID"), Label)<br /><br />            If chkDeletar.Checked Then<br />                Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))<br />                Dim SqlCmd As New SqlCommand("delete Lista where id=@ID", SqlCnn)<br />                SqlCmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = lblrptID.Text<br />                SqlCmd.Connection = SqlCnn<br />                SqlCnn.Open()<br />                SqlCmd.ExecuteNonQuery()<br /><br />                SqlCnn.Close()<br />            End If<br />        Next<br />        VinculaRepeater()<br /><br />    End Sub

Logo abaixo, vamos à
página em execução para a edição de dados:

Agora vemos o
JavaScript em execução, quando escolhe excluir um registro:

Simples, não é?!

No exemplo acima uso o código diretamente no code-behind por questão de praticidade, mas o ideal seria criar uma camada de acesso aos
dados separando esse código da páginas ASPX.

Pegue o projeto completo aqui: RepeaterCRUD.zip

Eu sei, é apenas ASP .NET,
mas eu gosto!

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil