domingo, 27 de março de 2011

Preenchendo um ListBox com LINQ To SQL

E aí, pessoal!

Pra quem utiliza o Microsoft SQL Server, uma das formas mais práticas e de fácil implementação, é a utilização do LINQ To SQL. O LINQ to SQL que é um O/RM (mapeamento objeto relacional) e permite que se execute consultas nas tabelas do banco de dados, além da execução de stored procedures e demais operações como atualização, inserção e exclusão de registros.

O ponto chave do LINQ é a forma com que ele converte os dados da base em objetos de modelo, fazendo com que o desenvolvedor programe os rotinas de persistência usando a orientação a objetos.
Para obter mais informações do LINQ To SQL, acesse o link abaixo:
http://msdn.microsoft.com/en-us/library/bb386976.aspx

Nosso objetivo no artigo, é alimentar um controle ListBox usando o LINQ To SQL em linguagem C#. Abra o Visual Studio e crie um novo projeto (File > New > Project) do tipo Windows Forms Application em linguagem C#.


Arraste o controle ListBox da Toolbox para o Form do projeto.


Adicione um novo arquivo LINQ To SQL Classes no projeto (Project > Add New Item) que é responsável por fazer o mapeamento objeto-relacional da base de dados Northwind (caso não tenha, baixe clicando aqui).

Na guia Server Explorer (caso não apareça na IDE do VS, clique em View > Server Explorer), crie uma conexão com o servidor SQL apontando para a base Northwind e arraste a tabela Products para o arquivo DBML.




No evento Load do Form, vamos escrever uma rotina para alimentar o controle ListBox usando o LINQ. Pressione a tecla F7 para acessar o View Code, copie e cole a listagem abaixo no evento Load.

private void Form1_Load(object sender, EventArgs e)
{
    NorthwindDataContext context = new NorthwindDataContext();
    var resultado = (from p in context.Products
                     orderby p.ProductName
                     select new { p.ProductID, p.ProductName }).ToList();
    listBox1.DataSource = resultado;
    listBox1.DisplayMember = "ProductName";
    listBox1.ValueMember = "ProductID";
}

Basicamente, criamos uma conexão com o Northwind usando o objeto NorthwindDataContext (que foi criado automaticamente após a adição da tabela Products), e através dele, fizemos uma seleção de todos os registros da tabela Products. A fonte de dados do controle é a variável resultado. Executando a aplicação (tecla de atalho F5), colocamos um break point na variável para visualizar o resultado antes de alimentar o controle. Veja o resultado na imagem a seguir.




É isso aí! A implementação é rápida e prática.
Até o próximo artigo aqui no Programação On-Line.

sexta-feira, 11 de março de 2011

Google Maps com ASP 3.0


O Google Maps Javascript API permite que se utilize com facilidade o serviço de localização do site maps.google.com. O código-fonte a seguir (que é correspondente à imagem acima), apresenta uma forma de se disponibilizar o recurso de pesquisa usando um campo de busca.

<% @Language="VBScript" %>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps JavaScript API com ASP3</title>
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/standard.css" rel="stylesheet" type="text/css" />
<style type="text/css">
    body {
        padding: 10 0 0 20;
        font-family: Trebuchet MS;
        font-size: 12px;
    }
    #titulo {
        font-size: 18px;
    }
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
  var geocoder;
  var map;
  function initialize() {
    geocoder = new google.maps.Geocoder();
    //coordenadas de são paulo
    var latlng = new google.maps.LatLng(-23.548943, -46.638818);
    var myOptions = {
      zoom: 10,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  }
 
  function codeAddress() {
    var address = document.getElementById("address").value;
    geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        map.setCenter(results[0].geometry.location);
        var marker = new google.maps.Marker({
            map: map,
            position: results[0].geometry.location
        });
      } else {
        alert("Geocode was not successful for the following reason: " + status);
      }
    });
  }
</script>
</head>
<body onLoad="initialize()">
<span id="titulo">Google Maps JavaScript API com ASP 3.0</span><br />
  Exemplo de como se renderizar uma mapa do Google Maps usando ASP 3.0
  <div>
    <input id="address" type="textbox" value="Pesquisar no Google Maps" style="width: 300px;">
    <input type="button" value="Pesquisar" onClick="codeAddress()">
  </div>
  <br />
  <br />
  <div align="left">
     <div id="map_canvas" style="height: 500px; width: 700px"></div>
  </div>
</body>
</html>


Se preferir, baixe o arquivo googleMaps.asp aqui no link.

Até a próxima!

quinta-feira, 10 de março de 2011

“ByVal” e “ByRef” em VB.NET

Saudações, pessoal!

O significado das palavras-chaves ByVal e ByRef é muito simples, só que ainda causam dúvidas em alguns programadores, principalmente àqueles que estão entrando neste universo particular. Para exemplificar, vamos utilizar dois procedimentos em VB.NET do tipo Sub, ou seja, que não retornam valores, sendo que os dois terão a mesma implementação, mudando somente o tipo de passagem de valores.

ByVal – Por valor. Um argumento definido como sendo ByVal, não altera o valor da variável que foi passada como parâmetro para o procedimento.
ByRef – Por referência. Um argumento definido como sendo ByRef, altera o valor da variável que foi passada como parâmetro para o procedimento.

Pela definição acima, percebemos que a diferença entre eles é bem simples. Vamos ao exemplo. Crie um novo projeto do tipo Windows Forms Application no Visual Studio (File > New > Project) em linguagem VB.NET.

Adicione dois controles Button ao Form, e altere a propriedade Text dos controles para “Método 1” e “Método 2”.



Pressione a tecla de atalho F7 para termos acesso ao View Code do Form. Escreva os procedimentos no editor conforme a listagem abaixo:

Private Sub Metodo1(ByVal param1 As Integer)
    param1 *= 2
End Sub

Private Sub Metodo2(ByRef param1 As Integer)
    param1 *= 2
End Sub

Volte para o Design do Form, e dê um duplo-clique no Button1. Escreva o trecho abaixo no evento Click do botão.

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
    Dim valor As Integer = 15
    Metodo1(valor)
    MessageBox.Show(valor.ToString(), "Método 1")
End Sub

Proceda da mesma forma para o Button2.

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
    Dim valor As Integer = 15
    Metodo2(valor)
    MessageBox.Show(valor.ToString(), "Método 2")
End Sub

A idéia é muito simples. Nos dois botões, declaramos uma variável chamada valor e inicializamos com o número 15. Após o procedimento, vamos exibir uma caixa de mensagem mostrando o novo valor da variável criada. Atente para os resultados dos métodos. Pressione a tecla F5 e rode a aplicação.

Clique no botão referente ao Método 1 e veja o resultado.



Agora, clique no botão do Método 2.



Percebeu a diferença? Pois é, o exemplo do projeto é muito simples, mas é claro e objetivo.
Espero ter ajudado a esclarecer a dúvida de alguns colegas da área.

Até a próxima!

quarta-feira, 9 de março de 2011

Carregar um CheckedListBox usando uma fonte de dados

Olá, pessoal.

Escrevi um outro artigo, que demonstra como preencher um controle CheckedListBox em linguagem C#, usando dados fictícios e sem a utilização de um DataSource. Já neste artigo, vamos ver como alimentar o mesmo controle usando uma classe de negócios, que vai ser a nossa fonte de dados (poderia ser uma base de dados).

Crie um novo projeto do tipo Windows Forms Application no Visual Studio (File > New > Project) em linguagem VB.NET.


Com o projeto criado, vamos adicionar uma classe (Project > Add Class) e nomeá-la para ProdutoBLL.
Codifique a classe criada com a listagem abaixo.


Namespace Controller
    Public Class ProdutoBLL
        Public Shared Function ListarProduto() As List(Of Produto)
            Dim _lista As New List(Of Produto)
            _lista.Add(New Produto(1, "Produto Teste 1"))
            _lista.Add(New Produto(2, "Produto Teste 2"))
            _lista.Add(New Produto(3, "Produto Teste 3"))
            Return _lista
        End Function
    End Class

    Public Class Produto
        Private _codigo As Integer
        Private _descricao As String

        Public Sub New()
        End Sub

        Public Sub New(ByVal codigo As Integer, ByVal descricao As String)
            Me.Codigo = codigo
            Me.Descricao = descricao
        End Sub

        Public Property Codigo() As Integer
            Get
                Return _codigo
            End Get
            Set(ByVal value As Integer)
                _codigo = value
            End Set
        End Property

        Public Property Descricao() As String
            Get
                Return _descricao
            End Get
            Set(ByVal value As String)
                _descricao = value
            End Set
        End Property
    End Class
End Namespace

Perceba que criamos uma outra classe (de modelo) com duas propriedades e dois métodos construtores.
Além disso, criamos um método estático que retorna uma coleção de Produtos que será utilizado para alimentar o CheckedListBox.

Voltando para o Form da aplicação, adicione um controle CheckedListBox e um Button. Não é necessário alterar a propriedade Name dos controles.

Pressione a tecla de atalho F7 para acessarmos o View Code. Implemente o formulário com a listagem de código abaixo.

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CheckedListBox1.DataSource = Controller.ProdutoBLL.ListarProduto()
        CheckedListBox1.DisplayMember = "Descricao"
        CheckedListBox1.ValueMember = "Codigo"
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For i = 0 To CheckedListBox1.CheckedItems.Count - 1
            MessageBox.Show(CType(CheckedListBox1.CheckedItems(i), Controller.Produto).Codigo)
        Next
    End Sub
End Class

No código acima, já codificamos também o evento Click do controle Button. Caso encontre alguma dificuldade neste trecho, volte para o Design do Form e dê um duplo-clique sobre o controle. Desta forma, o Visual Studio se encarrega de gerar a declaração do evento Click do botão. Ainda no escopo do evento Click, tivemos que utilizar a função CType para converter o item selecionado da iteração para um objeto da classe Produto. Sendo assim, conseguimos ter acesso a propriedade Codigo do objeto.

Um outro ponto importante, é a utilização das propriedades DisplayMember, que recebe o nome do campo que contém a descrição do produto e a ValueMember, que recebe o código do produto. Testando a aplicação, marque algum produto da listagem e clique no Button para obter o código do produto selecionado.


Seja usando uma fonte de dados ou não, conseguimos alimentar um controle CheckedListBox e ainda recuperar as informações pré-selecionadas pelo usuário.

Fico por aqui.
Até o próximo artigo!

terça-feira, 8 de março de 2011

Usando um objeto da classe Dictionary

Através do namespace System.Collections.Generic do .NET Framework, podemos encontrar várias classes que nos permitem criar coleções genéricas fortemente tipadas. Especificamente, vamos tratar sobre a classe Dictionary que nada mais é do que uma coleção que utiliza a dupla chave-valor. 


Para cada chave, teremos um valor correspondente e baseado no tipo que especificamos na instância da classe. 
Veja o método construtor da classe e seus devidos parâmetros de entrada. 

Dictionary (Of TKeyTValue)

Pois bem, vamos utilizar a linguagem VB.NET para demonstrar, mas as coleções estão disponíveis para linguagem suportadas pelo CLR (Common Language Runtime). Crie um novo projeto do tipo Windows Forms Application no Visual Studio (File > New > Project) em linguagem VB.NET. 




Imagine que a aplicação que iremos escrever, precise listar algumas formas de pagamento para alimentar um controle do tipo ComboBox. Pensando nisso, adicione uma classe na solução atual (Project > Add Class) e nomeie para Class1. 

Crie um método estático que retorne uma coleção do tipo Dictionary conforme a listagem abaixo.


Public Class Class1
    Public Shared Function FormaDePagamento() As Dictionary(Of StringByte)
        Dim _dicionario As New Dictionary(Of StringByte)
        With _dicionario
            .Add("CHEQUE", 1)
            .Add("CRÉDITO", 2)
            .Add("DÉBITO", 3)
            .Add("DINHEIRO", 4)
        End With
        Return _dicionario
    End Function
End Class

Voltando para o formulário do projeto, adicione um controle ComboBox e um Button. Posicione os controles de acordo com a imagem a seguir. 


Dê um duplo-clique no meio do Form1 e escreva as linhas abaixo no evento Load do formulário. Perceba que criaremos um objeto antes do evento, para que fique acessível em todo o escopo do Form1.


Dim _formaDePagamento As Dictionary(Of StringByte) = Class1.FormaDePagamento()

Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
    For Each o As KeyValuePair(Of StringByteIn _formaDePagamento
        ComboBox1.Items.Add(o.Key)
    Next
End Sub

Para concluir o exemplo, dê um duplo-clique no controle Button do Form e escreva as linhas abaixo no evento Click.

Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
    Dim codigo As String = _formaDePagamento(ComboBox1.Text)
    MessageBox.Show(codigo.ToString())
End Sub

Compilando a aplicação (e se tudo correr bem), teremos o resultado seguinte.

Para obter mais informações sobre a classe Dictionary, leia a documentação no MSDN.

Até mais!

segunda-feira, 7 de março de 2011

Executando múltiplas consultas usando um objeto Command

Pensando em um contexto de uma aplicação que executa múltiplas consultas em um banco de dados, e que deve evitar o máximo o consumo de recursos adicionais, é que resolvemos escrever este artigo. A idéia é utilizar somente um objeto Command para realizar as consultas e obter os resultados usando um objeto DataReader. 

Crie um novo projeto do tipo Web Site no Visual Studio (File > New > Web Site) em linguagem C#. 



Clique na aba Design da página Default.aspx do projeto e altere o fonte HTML conforme a listagem abaixo.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body style="font-family: Trebuchet MS;">
    <form id="form1" runat="server">
    <div>
        <b>Listagem de Produtos</b><br />
        <asp:ListBox ID="lstProduto" runat="server" Height="169px" Width="284px"></asp:ListBox><br /><br />
        <b>Listagem de Categorias</b><br />
        <asp:ListBox ID="lstCategoria" runat="server" Height="169px" Width="284px"></asp:ListBox><br />
    </div>
    </form>
</body>
</html>

Acesse o code-behind da página pressionando a tecla F7 e escreva as linhas de código abaixo.


protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        if (!Page.IsPostBack)
            this.ExecutarMultiplaConsulta();
    }
    catch (Exception ex)
    {
        ScriptManager.RegisterStartupScript(thisthis.GetType(), "erro",
                string.Format("alert('{0}');", ex.Message), true);
    }
} 

private void ExecutarMultiplaConsulta()
{
    using (SqlConnection con =
        new SqlConnection(ConfigurationManager.ConnectionStrings["connStringSqlServer"].ToString()))
    {
        using (SqlCommand cmd =
            new SqlCommand("SELECT * FROM Products; SELECT * FROM Categories", con))
        {
            cmd.CommandType = System.Data.CommandType.Text;
            con.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            //Preencher o primeiro ListBox com os produtos
            while (dr.Read())
            {
                lstProduto.Items.Add(dr["ProductName"].ToString());
            }
            //Obter o resultado da próxima query
            dr.NextResult();
            //Preencher o segundo ListBox com as categorias
            while (dr.Read())
            {
                lstCategoria.Items.Add(dr["CategoryName"].ToString());
            }
        }
    }
}

Antes de tudo, precisei criar uma connection string apontando para um servidor SQL Server local. Segue a configuração do arquivo web.config.


<connectionStrings>
<add name="connStringSqlServer" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=Northwind; Trusted_Connection=True;"providerName="System.Data.SqlClient"/>
</connectionStrings>

Perceba que alimentamos o objeto SqlCommand com duas querys separadas por “;” ponto-e-vírgula. O outro detalhe importante, é que após o preenchimento doListBox lstProduto, chamamos o método NextResult do SqlDataReader para que o mesmo selecione o resultado da segunda query. Testando a aplicação, teremos um resultado conforme a imagem a seguir.

Concluindo, conseguimos executar duas consultas no banco de dados, usando os mesmos objetos que seriam utilizados para uma única consulta. 
Por enquanto é só. 

Até o próximo artigo!