Artigos Técnicos :: ASP.NET

Interagindo com DataList em aplicações ASP.NET

Por Renato Haddad , Microsoft Most Valuable Professional. Autor de diversos livros
e ministra palestras e treinamentos sobre a tecnologia .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.

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.

Figura 1

Figura 1

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.

Figura 2

Figura 2

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:

ID: nono Name: nono 

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.

Cc517985.aspnet_datalist_3(pt-br,MSDN.10).gif

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.

Referências:

Faça o download deste documento:

Interagindo com DataList em aplicações ASP.NET

downl.gif formato Word, 87 Kb    

Mostrar: