Desenvolvimento - ASP. NET

Interagindo com DataList em aplicações ASP.NET

Uma das principais tecnologias na plataforma .NET é o desenvolvimento de aplicações para Internet, a facilidade de uso, as linguagens utilizadas, a quantidade de código escrito, os recursos do RAD (Rapid Application Development) do Visual Studio .NET, enfim, um conjunto de facilidades disponíveis que o desenvolvedor só tem a ganhar.

por Renato Haddad



Uma das principais tecnologias na plataforma .NET é o desenvolvimento de aplicações para Internet, a facilidade de uso, as linguagens utilizadas, a quantidade de código escrito, os recursos do RAD (Rapid Application Development) do Visual Studio .NET, enfim, um conjunto de facilidades disponíveis que o desenvolvedor só tem a ganhar.

O controle DataList tem um objetivo claro e definido: poupar código. Seu uso se dá em diversas situações onde é preciso preencher um conjunto de dados a partir de uma origem, uma fonte de dados que pode ser um Array ou vindos de um banco de dados através do ADO.NET.

O objetivo deste exemplo é criar dois DataList, um com os cargos (tabela jobs) e outro com os empregados (tabela employees) do respectivo cargo selecionado (Figura 1). O banco de dados será o velho e bom Pubs que se encontra no SQL Server 2000.

Crie um ASP.NET Web Application (Web Form) chamado myJobs.aspx contendo dois DataList (dlJobs e dlEmployees). Para efeito de layout inseri uma tabela com os itens posicionados no topo, mas sinta-se à vontade para personalizar a formatação.

DataList

O próximo passo é personalizar os DataLists, e existem duas formas: diretamente no código HTML ou através da IDE. Para isso, clique com o botão direito no dlJobs e selecione a opção Edit Template / Item Templates. Insira na seção ItemTemplate o controle LinkButton localizado na barra de Web Forms. Insira na seção SelectedItemTemplate um texto qualquer (nononono) e formate-o conforme a sua necessidade (Figura 2). A idéia desta seção é fazer com que assim que o item for selecionado, o mesmo tenha um destaque através da formatação.

Template

Para finalizar a edição clique com o botão direito no dlJobs e selecione End Template Editing. Como este DataList conterá a descrição dos cargos existentes, quando o Internauta selecionar um item é preciso obter o ID do cargo selecionado. Isso é possível através da propriedade DataKeyField = job_id. Isso é fundamental para este DataList senão o funcionamento não será adequado.

Para o dlEmployees personalize a seção ItemTemplate com a seguinte expressão:

<p>ID: nono Name: nono  </p>

O próximo passo é inserir no HTML o comando que referencia os campos dos DataReader que serão gerados. Clique no botão HTML, localize as seções no dlJobs e altere o nonono na seção SelectedItemTemplate e o LinkButton na seção ItemTemplate para a seguinte expressão:

<%# Container.DataItem("job_desc")%>

Para o dlEmployees troque o nono pelas seguintes expressões respectivamente:

<%# Container.DataItem("emp_id")%> e <%# Container.DataItem("fname") & " " & Container.DataItem("lname")%>.  

Veja parte do código HTML:

<asp:DataList id="dlJobs" runat="server" DataKeyField="job_id">
   <SelectedItemTemplate>
	<FONT color="#ff0000"><EM>
	<%# Container.DataItem("job_desc")%>
	</EM></FONT>
   </SelectedItemTemplate>
   <ItemTemplate>
        <asp:LinkButton id="LinkButton1" runat="server">
	<%# Container.DataItem("job_desc")%>
	</asp:LinkButton>
    </ItemTemplate>
</asp:DataList>
<asp:DataList id="dlEmployees" runat="server" BackColor="#FFFFC0">
    <ItemTemplate>
	<STRONG>ID:</STRONG>
	<%# Container.DataItem("emp_id")%>
	  <STRONG>Name:</STRONG>
	<%# Container.DataItem("fname") & " " & Container.DataItem("lname")%>
    </ItemTemplate>
</asp:DataList>

Uma vez configurados os DataLists é preciso inserir um pouco de programação para carregá-los com os dados. A classe utilizada para o ADO.NET é:

Imports System.Data.SqlClient

Insira o código no evento Page_Load para carregar o DataList de cargos. Note que os códigos estão documentados e através do IsPostBack o código é executado apenas uma vez.

If Not IsPostBack Then
   "invoca a rotina
   carregaJobs()
End If

Sub carregaJobs()
    "define a conexão
    Dim conn As New
	SqlConnection
	("Initial Catalog=pubs;Data Source=nomeDoServidor;User ID=usuario;Password=senha")
    "define a instrução sql
    Dim sql As String = "SELECT job_id, job_desc FROM jobs order by job_desc"
    "define o command e o DataReader
    Dim cmd As New SqlCommand(sql, conn)
    Dim dr As SqlDataReader
    "abre a conexão e executa o DataReader
    conn.Open()
    dr = cmd.ExecuteReader()
    "define a origem do dlJobs que é o DataReader gerado acima
    dlJobs.DataSource = dr
    "usa o DataBind para popular o controle
    dlJobs.DataBind()
    "fecha o DataReader e a conexão
    dr.Close()
    conn.Close()
End Sub

Este evento identifica qual foi o item selecionado e preenche o DataList de empregados pertencentes ao respectivo cargo. Note que a rotina carregaEmployees recebe o argumento o jobID e o utiliza na instrução para selecionar todos os empregados do respectivo cargo.

Private Sub
	dlJobs_ItemCommand
	(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
	Handles dlJobs.ItemCommand
    Dim jobID As Integer
    dlJobs.SelectedIndex = e.Item.ItemIndex
    carregaJobs()
    jobID = dlJobs.DataKeys(e.Item.ItemIndex)
    carregaEmployees(jobID)
End Sub

Sub carregaEmployees(ByVal jobID As Integer)
    Dim conn As New
	SqlConnection
	("Initial Catalog=pubs;Data Source=nomeDoServidor;User ID=usuario;Password=senha")
    Dim sql As String
    sql = "SELECT emp_id, fname, lname FROM employee "
    sql &= "WHERE job_id=" & jobID
    Dim cmd As New SqlCommand(sql, conn)
    Dim dr As SqlDataReader
    conn.Open()
    dr = cmd.ExecuteReader()
    dlEmployees.DataSource = dr
    dlEmployees.DataBind()
    dr.Close()
    conn.Close()
End Sub

Você tem como desafio inserir as rotinas de tratamento de erros Try / Catch / Finally.

Salve o projeto, compile e execute no navegador.

Projeto em execução

O DataList de empregados poderia ser qualquer outro controle como ListBox, DataGrid, DataRepeater, basta adaptar as devidas propriedades e métodos de cada controle. Perceba que a quantidade de código gerado para ter este tipo de controle é mínima em relação a outras tecnologias.

Renato Haddad

Renato Haddad - MVP, MCPD e MCTS, palestrante em eventos da Microsoft em diversos países, ministra treinamentos focados em produtividade com o VS.NET 2008, ASP.NET 3.5, Reporting Services e Windows Mobile.