Sei sulla pagina 1di 14

LINQ - Usando ComboBox com dados relacionados

Voc j notou que eu no paro de escrever sobre o LINQ , realmente eu gostei muito dos recursos que ele oferece e acho que se usado com bom senso trs grandes facilidades aos que gostam de desenvolver usando banco de dados. Ento vamos a mais um artigo sobre o LINQ, desta vez eu vou mostrar como podemos usar dados de tabelas relacionadas com ComboBox em aplicaes Windows Forms. Eu vou usar o LINQ To SQL , e apenas para lembrar , ele s funciona com o SQL Server. No exemplo deste artigo vou configurar uma combobox para filtrar registros que sero exibidos em um datagridview. um conceito bsico e clssico muitas vezes abordado em muitos artigos. O cenrio o seguinte: - Temos um banco de dados SQL Server, no exemplo eu vou usar o nosso saco de pancadas: Northwind.mdf; - Temos duas tabelas relacionadas; vamos usar as tabelas Products e Categories; O relacionamento entre essas tabelas mostrado na figura abaixo:

- Temos uma combobox que ir exibir todas as categorias da tabela Categories (registros da tabela Pai); - Temos um datagridview que ir exibir os produtos da tabela Products relacionados a categoria selecionada no combobox (registros da tabela filha); Vamos fazer isso usando LINQ To SQL e portanto vou usar o Visual Basic 2008 Express Edition. Crie uma nova aplicao do tipo Windows Forms Application com o nome de LINQ_ComboBox; Defina uma conexo com o banco de dados Northwind.mdf. A seguir vamos incluir uma referncia ao LINQ To SQL, selecione no menu a opo Project -> Add New Item;

Na janela Add New Item , selecione o template LINQ to SQL Classes e informe o nome Northwind.dbml (o nome pode ser qualquer um ao seu critrio)

Com isso poderemos gerar o mapeamento entre as tabelas do banco de dados e os objetos relacionados pois o LINQ ir gerar automaticamente classes para as tabelas mapeadas permitindo que sejam executadas operaes como consulta e atualizao

usando a sintaxe LINQ. Uma das vantagem disso que passamos a ter uma verificao em tempo de compilao e uma sintaxe nica baseada no cdigo Visual Basic sem ter comandos SQL embutidos no cdigo. Ser aberta o descritor Objeto-Relacional , vamos ento arrastar as tabelas Products e Categories a partir da janela DataBase Explorer para o descritor Objeto Relacional:

O descrito O/R gerou as classes Category e Product e atribui uma associao entre elas inferindo assim o relacionamento entre as tabelas. A classe Category contm uma coleo de classes Product chamada Products. Voc pode espiar o cdigo gerado no arquivo Northwind.designer.vb (expanda os objetos na janela Solution Explorer) Estamos pronto para trabalhar com a interface do cliente usando o formulrio Windows. Quando trabalhamos com dados vinculados em formulrios Windows usamos a janela Data Sources onde arrastamos as tabelas do banco de dados para criar e vincular os controles para exibio dos dados. O gerenciamento dos dados com os controles e a fonte de dados feita pelo BindingSource de forma transparente, e, ele pode gerenciar dados vinculados entre os controles e qualquer tipo de fonte de dados, incluindo colees de objetos e no apenas DataSets, desta forma podemos usar os mesmos recursos com as classes do LINQ To SQL. Vamos ento abrir a janela Data Sources a partir do menu Data -> Show Data Sources, e , a seguir clique no link: Add New Data Source; A seguir na janela Choose Data Source type selecione o tipo Object;

A seguir clique no boto Next> e vamos selecionar o objeto com o qual desejamos efetuar a vinculao. Vamos selecionar a classe Category pois esta classe ja contm uma coleo de produtos que iremos usar no nosos formulrio.

Clique em Next> e a seguir em Finish e voc ver na janela Data Sources a classe Category e a coleo de produtos;

Selecione o formulrio form1.vb e na janela Data Source selecione Category alterando o seu modo de exibio para ComboBox;

Altera tambm o modo de exibio de Products para DataGridView. Feito estes ajustes arraste a classe Category e a classe Products para formulrio form1.vb conforme o leiaute abaixo:

Ao arrastar o objeto Category sero criados os objetos CategoryBindingSource e CategoryBindingNavigator no formulrio. Podemos deletar o objeto CategoryBindingNavigator pois usaremos a combobox para selecionar os registros.Ao arrastar o objeto Products ser criado o objeto ProductsBindingSource.

A chave para que a vinculao de dados entre os controles seja feita de forma sincronizada que a propriedade DataSource do BindingSource filho deve estar definida para o BindingSource pai e a propriedade DataMember do BindingSource filho deve estar definida para o nome do relacionamento que neste caso o nome da coleo filho : Products. Abaixo temos uma viso destas configuraes que foram definidas automaticamente:

Se fosse feito via cdigo teriamos o seguinte:


Me.CategoryComboBox.DataSource = Me.CategoryBindingSource Me.CategoryComboBox.DisplayMember = "CategoryName" Me.ProductsBindingSource.DataMember = "Products" Me.ProductsBindingSource.DataSource = Me.CategoryBindingSource

Se voc espiar o cdigo gerado no vai encontrar pois o descritor no preenche os controles com os dados. Temos que fazer isso via cdigo. Abaixo temos o cdigo que preciso para preencher os controles com dados vinculados:

A classe NorthwindDataContext a classe que foi gerada quando ns criamos o nosso modelo objeto relacional northwind.dbml. Ela gerencia a conexo entre as classes LINQ To SQL e o banco de dados cuidando tambm das alteraes feitas nos objetos Category e Product. Tudo que precisamos fazer definir a propriedade DataSource do CategoryBindingSource igual a propriedade Categories do DataContext (db). Fazendo assim iremos iniciar a carga de todas as categorias a partir do banco de dados e iremos criar uma coleo de objetos Category. Note que no estamos carregando especificamente nenhum produto pois por padro o LINQ To SQL usa o lazy loading , ou carregamento tardio, para as colees relacionadas de forma os produtos sero carregados somente quando uma categoria for selecionada.

Executando o projeto teremos:

Aguarde mais artigos sobre LINQ. Pegue o projeto completo aqui: LINQ_ComboBox.zip

Eu sei apenas LINQ mas eu gosto...


Jos Carlos Macoratti

Potrebbero piacerti anche