sábado, 23 de abril de 2011

Alimentar dois controles ComboBox com LINQ To SQL em C#

Pré-requisitos:

E aí, pessoal!

Em outro momento, escrevemos um artigo ilustrando como “Preencher um ListBox com LINQ To SQL” (link acima).

Seguindo o mesmo raciocínio, vamos alimentar dois controles do tipo ComboBox com LINQ To SQL. A idéia é carregar o primeiro controle com algumas Categorias, e o segundo com os Produtos da categoria selecionada no controle anterior.

Abra o Visual Studio e crie um novo projeto (File > New > Project) do tipo Windows Forms Application em linguagem C#. O VS cria automaticamente um formulário (Form1) que será a janela que utilizaremos no projeto. Acesse a Toolbox, e arraste dois controles do tipo ComboBox para o Form1, e dois Labels para rotular as caixas de combinação.


Vamos adicionar ao projeto, o arquivo DBML (Project > Add New Item > LINQ To SQL Classes) que será responsável por fazer o mapeamento objeto-relacional das nossas tabelas (Categories e Products) da base Northwind. Não demonstraremos como fazer este procedimento, já que os detalhes foram postados no artigo de referência acima.Após o mapeamento das entidades, o arquivo DBML estará com a aparência da imagem abaixo.


Perceba que há um relacionamento entre as classes (tabelas) através do campo CategoryID, que é comum nas duas entidades. Usaremos este campo para obter os produtos da categoria selecionada. Selecione o Form1 na IDE do VS, e dê um duplo-clique no meio do formulário para que o Visual Studio crie o evento Load. Escreva a listagem abaixo no escopo do evento Load.

private void Form1_Load(object sender, EventArgs e)
{
    using (NorthwindDataContext context = new NorthwindDataContext())
    {
        var query = from c in context.Categories
                    select c;
        comboBox1.DataSource = query;
        comboBox1.DisplayMember = "CategoryName";
        comboBox1.ValueMember = "CategoryID";
    }
}

Se for executada a aplicação neste momento, perceba que o primeiro ComboBox (com as categorias) já está sendo devidamente preenchido.


Prosseguindo, resta escrever uma rotina para alimentar o segundo controle, quando o primeiro Combo for selecionado. O evento que usaremos é o SelectedIndexChanged do ComboBox. Acesse a guia Properties, selecione o controle comboBox1, clique no ícone Events e dê um duplo-clique sobre o evento SelectedIndexChanged.


Com este procedimento, o Visual Studio escreve o escopo do evento no editor, que será acionado ao selecionar um registro no Combo. Escreva o trecho de código abaixo no escopo do evento.

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    int categoryID = 0;
    if (int.TryParse(comboBox1.SelectedValue.ToString(), out categoryID))
    {
        using (NorthwindDataContext context = new NorthwindDataContext())
        {
            var query = from p in context.Products
                        where p.CategoryID == categoryID
                        select p;
            comboBox2.DataSource = query;
            comboBox2.DisplayMember = "ProductName";
            comboBox2.ValueMember = "ProductID";
         }
    }
}

Basicamente, ao selecionar uma categoria no primeiro ComboBox, será executado o evento SelectedIndexChanged que possui a rotina para preencher o segundo controle. Um detalhe importante, é que não escrevemos nenhum bloco de tratamento, já que o objetivo é demonstrar a usabilidade dos dois controles do tipo ComboBox.

Execute a aplicação e veja o resultado.


Espero que o artigo sirva de exemplo para uma implementação com LINQ e ComboBox.
Qualquer dúvida, é só enviar um e-mail para contato.programacao@gmail.com.

Até a próxima!

Nenhum comentário:

Postar um comentário

Deixe aqui seu comentário