Este mês escrevi poucos artigos. Também pudera , aproveitei e tirei umas férias ( ninguém é de ferro...). Agora que as férias estão no fim irei retomar o pique anterior...
Vou recomeçar falando sobre acesso a dados usando ADO.NET. Este artigo irá mostrar como podemos criar uma solução usando banco de dados e terá o objetivo de mostrar como podemos usar os objetos de acesso a dados do ADO.NET em formulários com combobox e caixas de texto.
Vou mostrar como criar um pequeno livro de receitas eletrônico onde você (sua mãe , sua namorada , sua esposa...) poderá guardar receitas classificadas por categoria. Nesta primeira parte irei mostrar como exibir os dados existentes nas tabelas do projeto - Cadastro de Receitas; mais adiante irei mostrar como podemos incluir , alterar , excluir , dados das receitas e gerenciar as categorias.
A idéia é a seguinte: Vamos supor que você resolveu agradar sua cara metade e também mostrar que é fera em programação Visual Basic e prometeu criar um cadastro de receitas eletrônico usando o VB .NET. Como você já é escolado percebeu que vai precisar usar um banco de dados. O velho e bom Access serve muito bem para esta solução caseira.
Entrou em cena suas habilidades de modelagem de dados e após consultar sua cara metade concluiu que o sistema poderia ser construído usando duas tabelas. Então você criou as tabelas Categorias (para armazenar os dados referente as categorias das receitas) e Receitas que irá guardar as receitas propriamente ditas.(Você resolveu chamar o banco de dados de : receitas.mdb)
A estrutura ficou assim :
Como está com pressa você acabou digitando alguns dados nas tabelas para ter uma idéia e a coisa ficou assim :
|
|
Rapidamente você pensou no seguinte layout para o formulário inicial :
1-) Duas combobox : uma carregada com as categorias e a outra deverá exibir as receitas relacionadas com a categoria da primeira combo , ou seja , as combos deverão estar sincronizadas de forma que quando for selecionada uma categoria na primeira combo somente as receitas relacionadas a esta categoria sejam carregadas na segunda combo. (Pensou que era fácil...)
2-) Duas caixas de texto : uma exibindo os ingredientes da receita e outra exibindo as instruções. Aqui também deverá haver o sincronismo com a seleção feita nas combobox de forma que a seleção de uma categoria ou receita mostre os ingredientes e instruções pertinentes. (Agora complicou... )
Pelo menos montar o layout do formulário você sabe. Abaixo o resultado :
Componentes do formulário: - cboCategorias - cboReceitas - txtIngredientes - txtInstruções - btnSair |
Pronto !!! Só falta fazer a conexão com os dados , escolher os componentes de dados que vai usar (DataReader ou DataSet) , carregar as combos , as caixas de texto e sincronizar tudo...
Então até o momento temos : o banco de dados Access receitas.mdb , as tabelas Categorias e Receitas e o layout do formulário principal. Nada mal. Falta dar vida a nossa aplicação ... è o que vamos fazer ...
O acesso aos Dados
Você terá que decidir como fará o acesso aos dados . Com toda a sua experiência você já sabe que como a base de dados é Access terá que usar um provedor OLE DB. Mas como será feito o acesso ? Quais as opções ?
Basicamente temos duas opções para o acesso aos dados : DataReader ou DataSet . E como você já leu o artigo - DataReader ou DataSet ? eis a questão !!! - no site do Macoratti , já sacou que para o seu projeto a opção de usar DataSet é a mais indicada.
Os próximos passos , calculados minuciosamente por você , serão :
criar a conexão com o banco de dados via objeto OleDBConnection
criar um DataAdapter para a tabela Categorias
Gerar o DataSet para a tabela Categorias
criar um DataAdapter para a tabela Receitas filtrando pelo campo categorias
Gerar o DataSet para a tabela Receitas
Configurar o DataSource para as caixas de combinação
Configurar a vinculação das caixas de texto com o Dataset
Ao trabalho :
1 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)
2- Abra a ToolBox e na aba Data clique duas vezes em OleDbConnection. Na caixa Properties clique em ConnectionString e a seguir em <New Connection> ; Na janela - Propriedades de vinculação de dados - na aba Provedor , selecione o provedor - Microsoft Jet 4.0 OLE DB Provider ; a seguir na aba Conexão insira o nome e caminho do banco de dados receitas.mdb. (veja figura abaixo)
|
|
Com isto a conexão esta configurada , vamos agora criar os objetos DataAdapter e DataSet para as tabelas...
3 - Vamos criar então o DataAdapter para a tabela Categorias . Ainda na ToolBox clique em OledbDataAdapter para acionar o assistente de configuração. Clique em Next> até chegar na janela - Generate SQL statements ; na caixa de texto informe a instrução SQL : Select * from Categorias . Clique me Next> e a seguir em Finish. Pronto ! criamos um objeto DataAdapter para a tabela categorias. Podemos chamá-lo de daCategorias.
Para gerar o DataSet para esta tabela basta clicar com o botão direito do mouse sobre o objeto daCategorias e selecionar a opção : Generate DataSet... . Na janela Generate DataSet clique em New e informe o nome do DataSet - dsCategorias - e clique em OK.
|
|
4 - Agora vamos criar DataAdapter para a tabela Receitas . Na ToolBox clique em OledbDataAdapter para acionar o assistente de configuração. Clique em Next> até chegar na janela - Generate SQL statements ; na caixa de texto informe a instrução SQL : SELECT Categoria, Ingredientes, Instrucoes, ReceitaID, ReceitaTitulo FROM Receitas WHERE (Categoria = ?). Clique me Next> e a seguir em Finish. Pronto ! criamos um objeto DataAdapter para a tabela categorias. Podemos chamá-lo de daReceitas.
Nota: A instrução SQL - SELECT Categoria, Ingredientes, Instrucoes, ReceitaID, ReceitaTitulo FROM Receitas WHERE (Categoria = ?) usa o campo Categoria como parâmetro para filtrar as receitas para cada categoria.
Para gerar o DataSet para esta tabela basta clicar com o botão direito do mouse sobre o objeto daReceitas e selecionar a opção : Generate DataSet... . Na janela Generate DataSet clique em New e informe o nome do DataSet - dsReceitas - e clique em OK.
|
|
A esta altura do campeonato , o seu projeto deverá ter a seguinte aparência :
|
5- Temos que configurar os controles do formulário para a vinculação dos dados. Vamos começar com as combos. Selecione a combo - cboCategorias - e na janela de propriedades vamos definir as propriedades DataSource e DisplayMember como ao lado: |
^ |
6- Selecione agora a combo - cboReceitas e configure suas propriedades: DataSource e DisplayMember como ao lado: |
7- Passemos para a configuração das caixas de texto : txtingredientes e txtinstrucoes. Selecione cada caixa de texto e altere sua propriedades DataBindings opção Text , na caixa de propriedades , conforme abaixo
|
|
Caixa de texto : txtingredientes | Caixa de texto : txtinstrucoes |
Com os objetos de acesso aos dados e os controles configurados só resta incluir o código que irá gerenciar a vinculação dos controles com a fonte de dados . Para isto vamos usar a classe BindingManagerBase. A classe BindingManagerBase gerencia todos os objetos vinculados a mesma fonte de dados. (Ela é uma classe abstrata: a Classe CurrencyManager herda seus métodos.) e possibilita a sincronização dos controles vinculados aos dados em um formulário Windows que estão ligados a mesma fonte de dados. Para isto vamos declarar uma variável do tipo BindingManagerBase logo no início da classe:
Public Class Form1Inherits System.Windows.Forms.Form Dim receitasBindingManager As BindingManagerBase |
Agora podemos incluir o restante do código no projeto. Vamos incluir o código no evento Load do formulário que irá preencher os DataSets : DSCategorias1 e DSReceitas1.
Private
Sub Form1_Load(ByVal
sender As System.Object, ByVal e
As System.EventArgs) Handles
MyBase.Load
daCategorias.Fill(DsCategorias1) daReceitas.Fill(DsReceitas1) receitasBindingManager = Me.BindingContext(DsReceitas1, "Receitas") End Sub |
Cada objeto que herda da classe Control possui um objeto BindingContext . Usamos o BindingContext para criar ou retornar o BindingManagerBase para a fonte de dados usado pelo controles vinculados aos dados.
O código abaixo deve ser incluído no evento SelectedIndexChanged da primeira caixa de combinação - cboCategorias - de forma que quando um usuário selecionar uma categoria , os dados das receitas relacionadas a esta categoria seja exibidas na segunda caixa de combinação.
Private
Sub
cbocategorias_SelectedIndexChanged(ByVal
sender As System.Object, ByVal e
As System.EventArgs) Handles
cbocategorias.SelectedIndexChanged
DsReceitas1.Clear() daReceitas.SelectCommand.Parameters("Categoria").Value = cbocategorias.Text daReceitas.Fill(DsReceitas1) cboreceitas.Focus()
End Sub |
Finalmente o código do evento SelectedIndexChanged da segunda caixa de combinação - cboReceitas - efetua a sincronização com o item selecionado.
Private
Sub
cboreceitas_SelectedIndexChanged(ByVal
sender As System.Object, ByVal e
As System.EventArgs) Handles
cboreceitas.SelectedIndexChanged receitasBindingManager.Position = cboreceitas.SelectedIndex End Sub |
O método Position da classe BindingManagerBase obtêm ou define a posição na lista de controles vinculados para onde a fonte de dados aponta.
Pronto !! agora é só rodar o projeto e verificar o seu funcionamento.
Abaixo um exemplo exibindo o projeto em execução.
Nesta primeira parte apenas exibimos os dados existentes nas tabelas categorias e receitas em controles vinculados de formulário.
Na segunda parte irei mostrar como podemos cadastrar categorias e receitas. Aguarde.
Até breve ...
José Carlos Macoratti