ASP.NET
2.0 - Realizando a manutenção de dados com o controle Repeater
E lá vamos nós voltar a abordar o controle Repeater 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.
Embora este controle tenha tido a grande parte de suas funcionalidades absorvidas pelos novos controles GridView, DetailsView, e FormView na ASP.NET 2.0 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 repetidas de itens a ele vinculados podendo ser usado para exibir registros de fonte de dados diversas. O controle esta 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.
Então vamos a prática...
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 e usando o controle Repeater.
Abra o Visual Web Developer 2010 Express e no menu File selecione New Web Site;
A seguir selecione o template ASP .NET Empty Web Site, usando a linguagem Visual Basic, e informe o nome RepeaterCRUD e clique em OK;
![]() |
Vamos incluir um WebForm no projeto. No menu WebSite selecione Add New Item e a seguir 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> <add key="ConnectionString" value="Data Source=.\SQLEXPRESS;Initial Catalog=Escola;Integrated Security=True"/> </appSettings> |
Vamos definir a interface usando o controle Repeater na página Default.aspx conforme o leiaute exibido a seguir:
![]() |
Estamos usando os seguintes controles nesta página:
O código fonte da página é dada a seguir deve ser colocado entre as tags <div> da página Default.aspx:
<asp:Repeater ID="cpRepeater" runat="server" onitemcommand="cpRepeater_ItemCommand"
onitemdatabound="cpRepeater_ItemDataBound">
<HeaderTemplate>
<table width="500px" border="1px">
<tr style="background-color:#99CCFF">
<td >Email</td>
<td >Aluno</td>
<td >Curso</td>
<td >Opções</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr style="background-color:#ffffff">
<td >
<asp:CheckBox ID="chkDeletar" runat="server" />
</td>
<td >
<asp:Label ID="lblid" Visible="false" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "id") %>'></asp:Label>
<asp:Label ID="lblNome" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "nome")%>'></asp:Label>
<asp:TextBox ID="txtNome" BackColor="#d4d0c8" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "nome")%>' Visible="false"></asp:TextBox>
</td>
<td>
<asp:DropDownList ID="ddlCurso" runat="server">
</asp:DropDownList>
</td>
<td >
<asp:LinkButton ID="lnkEditar" runat="server" CommandName="edit" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Editar</asp:LinkButton>
<asp:LinkButton Visible="false" ID="lnkAtualizar" runat="server" CommandName="update" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Atualizar</asp:LinkButton>
<asp:LinkButton Visible="false" ID="lnkCancelar" runat="server" CommandName="cancel" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Cancelar</asp:LinkButton>
<asp:LinkButton ID="lnkDeletar" runat="server" CommandName="delete" OnClientClick='javascript:return confirm("Confirma a exclusão deste registro ?")'
CommandArgument='<%# DataBinder.Eval(Container.DataItem, "id") %>'>Deletar</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
<tr style="background-color:#15880a">
<td colspan="5">
</FooterTemplate>
</asp:Repeater>
<asp:LinkButton ID="lnkDelSelecionado" ForeColor="White" runat="server" onclick="LinkButton1_Click"
OnClientClick='javascript:return confirm("Confirma exclusão do registro selecionado?")'>Deletar Selecionado</asp:LinkButton>
|
Observe que estamos usando os templates: HeaderTemplate, ItemTemplate e FooterTemplate.
Estamos usando 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 vamos colocar 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
If Not IsPostBack Then
VinculaRepeater()
End If
End Sub
|
O código da rotina VinculaRepeater() é dado 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()
Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))
Dim SqlCmd As New SqlCommand("select * from Lista", SqlCnn)
Dim Sqlda As New SqlDataAdapter(SqlCmd)
Dim ds As New DataSet()
Sqlda.Fill(ds, "Lista")
cpRepeater.DataSource = ds
cpRepeater.DataBind()
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
Dim lnkAtualizar As LinkButton = DirectCast(e.Item.FindControl("lnkAtualizar"), LinkButton)
Dim lnkCancelar As LinkButton = DirectCast(e.Item.FindControl("lnkCancelar"), LinkButton)
Dim lnkEditar As LinkButton = DirectCast(e.Item.FindControl("lnkEditar"), LinkButton)
Dim lnkDeletar As LinkButton = DirectCast(e.Item.FindControl("lnkDeletar"), LinkButton)
Dim lblNome As Label = DirectCast(e.Item.FindControl("lblNome"), Label)
Dim lblrptID As Label = DirectCast(e.Item.FindControl("lblid"), Label)
Dim txtNome As TextBox = DirectCast(e.Item.FindControl("txtNome"), TextBox)
Dim ddlCurso As DropDownList = DirectCast(e.Item.FindControl("ddlCurso"), DropDownList)
Dim chkDeletar As CheckBox = DirectCast(e.Item.FindControl("chkDeletar"), CheckBox)
If e.CommandName = "edit" Then
lnkCancelar.Visible = True
lnkAtualizar.Visible = True
lnkEditar.Visible = False
txtNome.Visible = True
lblNome.Visible = False
End If
If e.CommandName = "cancel" Then
VinculaRepeater()
End If
If e.CommandName = "update" Then
Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))
Dim SqlCmd As New SqlCommand("update Lista set nome=@Nome, curso=@Curso where id=@ID", SqlCnn)
SqlCmd.Parameters.Add("@nome", SqlDbType.VarChar).Value = txtNome.Text
SqlCmd.Parameters.Add("@curso", SqlDbType.VarChar).Value = ddlCurso.SelectedItem.Text
SqlCmd.Parameters.Add("@id", SqlDbType.VarChar).Value = e.CommandArgument
Try
SqlCnn.Open()
SqlCmd.ExecuteNonQuery()
Catch ex As Exception
ex.Message.ToString()
Finally
If SqlCnn.State = ConnectionState.Open Then
SqlCnn.Close()
End If
End Try
VinculaRepeater()
End If
If e.CommandName = "delete" Then
Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))
Dim SqlCmd As New SqlCommand("delete Lista where id=@ID", SqlCnn)
SqlCmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = e.CommandArgument
Try
SqlCnn.Open()
SqlCmd.ExecuteNonQuery()
Catch ex As Exception
ex.Message.ToString()
Finally
If SqlCnn.State = ConnectionState.Open Then
SqlCnn.Close()
End If
End Try
VinculaRepeater()
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; 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
Dim ddlCurso As DropDownList = DirectCast(e.Item.FindControl("ddlCurso"), DropDownList)
If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))
Dim SqlCmd As New SqlCommand("select * from Lista", SqlCnn)
Dim Sqlda As New SqlDataAdapter(SqlCmd)
Dim ds As New DataSet()
Dim dt As New DataTable()
Sqlda.Fill(dt)
ddlCurso.DataTextField = "Curso"
ddlCurso.DataSource = dt
ddlCurso.DataBind()
ddlCurso.SelectedValue = DataBinder.Eval(e.Item.DataItem, "curso").ToString()
End If
End Sub
|
No evento Click do linkButton - Deletar Selecionado - verificamos se o checkbox esta marcado para o registro e excluímos o mesmo da tabela em caso positivo;
Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkDelSelecionado.Click
For Each Item As RepeaterItem In cpRepeater.Items
Dim chkDeletar As CheckBox = DirectCast(Item.FindControl("chkDeletar"), CheckBox)
Dim lblrptID As Label = DirectCast(Item.FindControl("lblID"), Label)
If chkDeletar.Checked Then
Dim SqlCnn As New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))
Dim SqlCmd As New SqlCommand("delete Lista where id=@ID", SqlCnn)
SqlCmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = lblrptID.Text
SqlCmd.Connection = SqlCnn
SqlCnn.Open()
SqlCmd.ExecuteNonQuery()
SqlCnn.Close()
End If
Next
VinculaRepeater()
End Sub
|
Abaixo vamos a página em execução para edição de dados:
![]() |
Abaixo vemos o JavaScript em execução quando o escolhe excluir um registro:
![]() |
Simples, simples assim...
No exemplo acima eu estou usando o código diretamente no code-behind por questão de simplicidade 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ências: