 ASP.NET  - Usando o Controle ListBox
ASP.NET  - Usando o Controle ListBox
Neste 
artigo vamos preencher um controle ListBox com dados de uma fonte de dados MSDE 
no VS.NET e com dados de um banco de dados Access no WebMatrix. Após preencher o 
controle, será permitido ao usuário selecionar um item da lista e ver os 
detalhes em caixas de textos.
 
Em ambos os casos iremos acessar a tabela Products do banco de dados Northwind. A estrutura da tabela é a seguinte :
|  | 
Você precisa ter o MSDE instalado e fazer a migração do banco de dados Northwind.mdb do Access para o MSDE conforme mostrado nos artigos:
1- O projeto no Visual Studio
Inicie um novo projeto no VS.NET do tipo ASP.NET Web Application com o nome de listboxNet.
Inclua os seguintes controles no formulário a partir da caixa de ferramentas:
1 controle do servidor ListBox - defina sua propriedade AutoPostBack como True (se não a página não vai funcionar...) e como o ID igual a lstProducts
7 controles Labels e 7 Controles do servidor TextBox; nomeando cada caixa de texto com o nome do campo que vamos exibir:
txtID , txtName, txtQtyPerUnit, txtUnitPrice, txtUnitsInStock, txtUnitsOnOrder e chkDC
Inclua também uma label para mensagens chamada lblmsg.
Abaixo o layout do formulário do projeto no VS.NET.
|  | 
- Vamos incluir a string de conexão com o MSDE no arquivo de configuração Web.Config conforme indicado abaixo:
| <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="strConn" value="Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;User ID=sa;password=; Data Source=MACORATI\VSDOTNET"; /> </appSettings> <system.web> ...... ..... | 
A seguir defina as importações necessárias ao código do projeto :
| ImportsSystem.Web.Security ImportsSystem.Data ImportsSystem.Data.OleDb ImportsSystem.Configuration | 
Defina a string de conexão que no caso será a de acesso ao MSDE instalado na minha máquina , faça os ajustes para o seu caso:
Dim MyConn As OleDbConnection = New OleDbConnection(ConfigurationSettings.AppSettings("strConn"))No evento Load da página inclua o código abaixo:
| Private Sub Page_Load(ByVal 
    sender As System.Object, 
    ByVal e As System.EventArgs)
    Handles MyBase.Load 
	 carregaLista() ' define o item padrao selecionado lstProducts.SelectedIndex = 0 End IfEnd Sub 
 | 
A rotina CarregaLista() tem o seguinte código :
| PrivateSub carregaLista() Dim strProducts As String = "SELECT ProductID, ProductName FROM Products" Dim oCmd As New OleDbCommand(strProducts, MyConn) Dim objReader As OleDbDataReader 
	 If MyConn.State = ConnectionState.Closed Then MyConn.Open() 
	   
    End  
	If 'fazendo assim podemos fechar o datareader e a conexao ao mesmo tempo objReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection) 
 'limpa os itens anteriores do listbox lstProducts.Items.Clear() 
	 lstProducts.DataValueField = "ProductID" 
 ' define DataTextField para o texto/dados que desejamos exibir lstProducts.DataTextField = "ProductName" 
 ' define o DataSource para o resultado do OleDBDataReader lstProducts.DataSource = objReader 
 ' vincula o datasoure ao controle do servidor lstProducts.DataBind() 
 ' fecha o datareader e a conexao objReader.Close() Catch ex As Exception 'trata a exceção MsgBox("Error Connecting to Database!", MsgBoxStyle.Critical) End TryEnd Sub | 
Quando o usuário selecionar um item da lista o mesmo deverá exibir os detalhes nas caixas de texto , para isto devemos incluir o seguinte código no evento SelectedIndexChanged do ListBox que usa um DataReader para obter os dados e exibir nas caixas de texto:
| PrivateSub lstProducts_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)_ Handles lstProducts.SelectedIndexChanged 
 Dim objReader As OleDbDataReader 
	Dim 
    strSQL As  
	String strSQL = "SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock," strSQL &= " UnitsOnOrder, ReorderLevel, Discontinued FROM Products" strSQL &= " WHERE ProductID = " 
	 strSQL &= lstProducts.SelectedItem.Value objCmd = New OleDbCommand(strSQL, MyConn) 
	 If MyConn.State = ConnectionState.Closed Then MyConn.Open() 
	   
    End  
	If objReader = objCmd.ExecuteReader(CommandBehavior.CloseConnection) 
	   
    ' percorre o dataread para retornar os dados e atribui aos textbox While objReader.Read() With objReader txtID.Text = .Item("ProductID") txtName.Text = .Item("ProductName") txtQtyPerUnit.Text = .Item("QuantityPerUnit") txtUnitPrice.Text = .Item("UnitPrice") txtUnitsInStock.Text = .Item("UnitsInStock") txtUnitsOnOrder.Text = .Item("UnitsOnOrder") 'txtReOrder.Text = .Item("ReorderLevel") chkDC.Checked = .Item("Discontinued") End With End While Catch ex As Exception lblmsg.Text = ex.Message End TryEnd Sub | 
Executando o projeto no VS.NET teremos o resultado da página abaixo:
|  | 
2- O projeto no Web Matrix
O projeto no Web Matrix , e , que será exibido on-line, é quase idêntico ao do VS.NET apenas vou exibir somente alguns campos da tabela Products e vou usa o controle HTML do tipo Table para formatar a apresentação dos dados. Além disso , vou usar uma conexão com o banco de dados Northwind.mdb definido em uma string de conexão conforme abaixo :
Dim MyConn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\northwind.mdb")
Crie um a nova página ASP.NET no Web Matrix e na área de Design inclua além dos controles já usados no projeto acima um controle HTML Table , conforme layout abaixo:
| 
     | 
O código usado é semelhante ao do projeto do VS.NET. Abaixo temos o código do script VB.NET completo exibido na guia All:(Não vou exibir o código HTML que é gerado pois seria muito poluido)
| <%@ Page Language="VB" %> <%@ import Namespace="System.Data" %> <%@ import Namespace="System.Data.OleDb" %> 
    <script runat="server"> Dim MyConn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\northwind.mdb") 
 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If Not Page.IsPostBack Then 'carrega o listbox com os dados das categorais carregaLista() ' define o item padrao selecionado lstProducts.SelectedIndex = 0 End If End Sub 
 Private Sub carregaLista() Dim strProducts As String = "SELECT ProductID, ProductName FROM Products" Dim oCmd As New OleDbCommand(strProducts, MyConn) Dim objReader As OleDbDataReader 
 Try 'verifica se a conexão ja esta aberta, se não estiver, abre If MyConn.State = ConnectionState.Closed Then MyConn.Open() End If 'atribui o objeto DataReader Obj ao resultado do modo da conexão 'fazendo assim podemos fechar o datareader e a conexao ao mesmo tempo objReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection) 'limpa os itens anteriores do listbox lstProducts.Items.Clear() ' define a propriedade DataValueField para chave primaria lstProducts.DataValueField = "ProductID" ' define DataTextField para o texto/dados que desejamos exibir lstProducts.DataTextField = "ProductName" ' define o DataSource para o resultado do OleDBDataReader lstProducts.DataSource = objReader ' vincula o datasoure ao controle do servidor lstProducts.DataBind() ' fecha o datareader e a conexao objReader.Close() Catch ex As Exception 'trata a exceção MsgBox("Erro durante conexão com a base de dados !", MsgBoxStyle.Critical) End Try End Sub 
 Sub lstProducts_SelectedIndexChanged(sender As Object, e As EventArgs) 
 Dim objCmd As OleDbCommand Dim objReader As OleDbDataReader Dim strSQL As String 
 ' monta o comando SQL strSQL = "SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock," strSQL &= " UnitsOnOrder, ReorderLevel, Discontinued FROM Products" strSQL &= " WHERE ProductID = " 'retorna o DataValueField strSQL &= lstProducts.SelectedItem.Value 
 objCmd = New OleDbCommand(strSQL, MyConn) 
 Try 'se a conexao estiver fechada abre If MyConn.State = ConnectionState.Closed Then MyConn.Open() End If 
 objReader = objCmd.ExecuteReader(CommandBehavior.CloseConnection) ' percorre o dataread para retornar os dados e atribui aos textbox While objReader.Read() With objReader txtID.Text = .Item("ProductID") txtName.Text = .Item("ProductName") 'txtQtyPerUnit.Text = .Item("QuantityPerUnit") txtUnitPrice.Text = .Item("UnitPrice") txtUnitsInStock.Text = .Item("UnitsInStock") 'txtUnitsOnOrder.Text = .Item("UnitsOnOrder") 'txtReOrder.Text = .Item("ReorderLevel") 'chkDC.Checked = .Item("Discontinued") End With End While 
 Catch ex As Exception lblmsg.Text = ex.Message End Try     
    End Sub | 
Executando o projeto no servidor do Web matrix temos:
|  | 
Pegue o 
projeto completo aqui :  lstboxnet.zip
 
lstboxnet.zip
Veja a página funcionando aqui : http://www.macoratti.net/aspnet/listboxnet.aspx
Eu sei 
, é apenas ASP , but I like it  !!!

| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? | 
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a 
Objetos com VB .NET
