.NET

20 jan, 2011

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

Publicidade

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>
<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 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" 
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.

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
If Not IsPostBack Then
VinculaRepeater()
End If
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()
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 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

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 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
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

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!