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 SubO 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 SubO 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 IfNo 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 SubNo 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 SubLogo 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!








