tutorial c# (cadastro cliente) - artigo redigido por wellington balbo de camargo

123
Olá pessoal, começo aqui mais uma série de artigos criando aplicações simples em Windows Forms usando a linguagem C# e o banco de dados SQL Server. Desta vez iremos criar um sistema de um consultório médico, com cadastro de pacientes, médicos e consultas. Faço este artigo com base nas videoaulas de Windows Forms de Luciano Pimenta, do Portal Linha de Código. Acompanhem o passo-a-passo: Começe abrindo o SQL Server e crie um novo database com o nome Consultorio. Após isso crie as tabelas de Pacientes, Médicos e Consultas, conforme mostra a imagem abaixo: Agora é preciso criar os relacionamentos entre as tabelas. Para isso, no Solution Explorer, clique com o botão direito na tabela Consulta recém criada, clique em Design, depois nos botões do menu clique em Relationships, como mostra a imagem: Na janela que surge, clique no botão Add, abra a aba Tables and Columns Specification e clique no botão ao lado:

Upload: rafael-marins

Post on 01-Jul-2015

6.459 views

Category:

Documents


2 download

DESCRIPTION

Tutorial muito informativo para inciantes em C#.Todos os creditos devidos ao senhor Wellington Balbo de Camargo que fez esse artigo.Obrigado por partilhar seus conhecimentos!

TRANSCRIPT

Page 1: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Olá pessoal, começo aqui mais uma série de artigos criando aplicações simples em Windows

Forms usando a linguagem C# e o banco de dados SQL Server. Desta vez iremos criar um

sistema de um consultório médico, com cadastro de pacientes, médicos e consultas.

Faço este artigo com base nas videoaulas de Windows Forms de Luciano Pimenta, do Portal

Linha de Código. Acompanhem o passo-a-passo:

Começe abrindo o SQL Server e crie um novo database com o nome Consultorio. Após isso

crie as tabelas de Pacientes, Médicos e Consultas, conforme mostra a imagem abaixo:

Agora é preciso criar os relacionamentos entre as tabelas. Para isso, no Solution Explorer,

clique com o botão direito na tabela Consulta recém criada, clique em Design, depois nos

botões do menu clique em Relationships, como mostra a imagem:

Na janela que surge, clique no botão Add, abra a aba Tables and

Columns Specification e clique no botão ao lado:

Page 2: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Na janela que abre, em Primary key table, faça os relacionamentos, escolhendo a Coluna

Medico e abaixo relacione o IDMedico da tabela Medico com o IDMedico da tabela Consulta.

Faça isso também com a tabela Pacientes:

Após isso, salve a tabela, irá aparecer uma mensagem avisando que as alterações feitas se

aplicarão nas demais tabelas, clique em Sim e aguarde.

Agora abra o Visual Studio, crie um novo projeto Windows Forms e dê o nome

de Consultas:

Page 3: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Será gerado um formulário, ele será nosso form principal, clique nele, abra a janela

Properties (CTRL+W+P) altere as seguintes propriedades:

- Text – coloque o nome Consultas

- (Name) – altere para frmPrincipal

- WindowState – altere para Maximized, para abrir sempre maximizado

- MaximizeBox – false

- MinimizeBox – false – para que só apareça o botão de fechar no form

- KeyPreview – true, para ativar o uso do teclado nos eventos do form

Agora abra a janela Toolbox (CTRL+W+X) e arraste da aba Menus & Toolbars um Toolstrip,

que nada mais é do que uma barra de controles para seu form. Clique no botão ao lado dele,

selecione o controle Button, clique com o botão direito nele e clique

em DisplayStyle >ImageAndText. Seu form deverá ficar assim:

Page 4: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora vamos adicionar um novo Data Source, para isso, clique no menu Data > Add New

Data Source. Na janela que aparece, selecione Database e clique em Next. Essa parte do

exemplo é bem parecida com a que ensinei na 1ª parte do artigo de Acesso á Dados,

postada dias atrás.

Clique em New Connection, selecione em Server Name, o servidor local do seu pc, se

estiver com dúvidas quanto a isso, apenas digite (local)\SQLEXPRESS (lembrando que este

exemplo usa a versão Express do SQL Server), selecione o Database Consultorio, criado

anteriormente, clique em OK, em Next, altere o nome de sua connectionstring para

strConsultorio, clique em Next e aguarde. Na próxima tela será perguntado quais objetos

você deseja adicionar ao seu DataSet, clique em Tables, altere o nome do seu DataSet se

quiser e clique em Finish.

Page 5: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Á primeira vista, parece que nada aconteceu, mais se você abrir a janela Solution

Explorer(CTRL+W+S) ou clicar em Data > Show Data Sources (SHIFT+ALT+D) verá que

nosso DataSet foi criado com sucesso:

No Solution Explorer, clique no nosso projeto com o botão direito e clique

em Add > Windows Form. Dê o nome de frmMedico e clique em OK.

Altere a proprieade Text para Cadastro de Médicos e na janela Data Sources que vemos na

imagem acima, repare que nossas tabelas trazem os controles adequados a elas, como por

Page 6: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

exemplo, se você expandir a tabela Medico, e clicar em IDMedico verá que podemos usar um

Textbox, um Label, etc. Isso é feito automaticamente pelo próprio Visual Studio, ele mapeia

os dados que vem do banco SQL e nos mosta quais os controles mais adequados à cada

coluna:

Altere o controle Label para o campo IDMedico como mostra a imagem acima. Agora arraste

a tabela Medico para nosso form que ele cria automaticamente a estrutura necessária para

inserir dados em nosso form. Faça os ajustes necessários nos campos como mostra a

imagem:

Agora volte ao formulário principal, dê dois cliques no controle ToolStrip que adicionamos a

ele ou aperte F7 para ir ao evento toolStripButton1_Click e insira o seguinte código:

Page 7: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

O que fiz no código acima foi instanciar o formulário médico e fazer a chamada a ele por

meio do método ShowDialog().

Agora compile o projeto e veja o resultado:

Experimente inserir, salvar e excluir registros, pare a compilação e compile de novo e note

que os registros são salvos no banco e estão disponíveis para posterior consulta. Assim,

encerramos aqui a 1ª parte da série de artigos de Windows Forms com acesso à dados.

Nesta parte iremos criar o Cadastro de Pacientes e o Cadastro de Consultas e

aplicaremos algumas configurações nestes forms e nos demais. Acompanhem:

Abra seu projeto no Visual Studio e abra o modo design do Cadastro de Médicos. Iremos

aplicar algumas configurações que serão padronizadas, ou seja, serão aplicadas à todos os

forms para que sigam um determinado padrão.

Abra a janela Properties (CTRL+W+P ou F4) e altere as propriedades:

- Text – na seleção de registros of {0} altere para de {0}

- FormBorderStyle – altere para FixedSingle para que o form não possa ser

redimensionado

- Start Position – coloque CenterScreen para que o form abra no meio da tela

- MaximizeBox – false

- MinimizeBox – false – para que só apareça o botão de fechar no form

- KeyPreview – true, para ativar o uso do teclado nos eventos do form

Seu form deverá ficar com propriedades iguais ao do form principal.

Agora clique no formulário e aperte F7 para ir à página de código e note que, a partir do

momento em que foi adicionado o DataSet e seus demais controles, o Visual Studio

automaticamente adicionou também códigos ao nosso form:

Page 8: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Vamos fazer uma verificação simples para que, se o usuário apertar a tecla ESC, feche o

formulário. Para isso, na janela propriedades do form Medico, vá nos eventos e dê dois

cliques no evento KeyDown. Irá se abrir a tela de códigos, nela insira o código abaixo:

No código acima fiz a verificação se a tecla digitada foi ESC, se foi, automaticamente o form

é fechado. Se não, nada acontece. Simples.

Cadastro de Pacientes – Vamos criar agora um novo form. Na Solution Explorer, clique

com o botão direito no projeto, clique em Add > Windows Form e dê o

nome frmPacientes.

Neste form, aplique as configurações padronizadas que definimos no começo do artigo. Dê o

nome de Cadastro de Pacientes à esse novo form. Agora abra o evento KeyDown deste

form e aplique o mesmo código do anterior, para que, quando o usuário apertar a tecla ESC,

o form feche automaticamente.

Vamos configurar nosso data source. Para isso, abra a janela Data Sources (SHIFT + ALT +

D), clique no botão ao lado de Paciente e troque o formato dele para Details, como mostra

imagem a seguir:

Page 10: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora vamos ao form principal, adicionar outro botão para fazer a chamada à este form que

criamos. No form principal, clique no botão de Cadastro de Médicos, irá aparecer outro

botão ao lado, clique nele e clique em Button. Agora clique com o botão direito no botão

recém criado, e clique em DisplayStyle > ImageAndText, como a figura abaixo nos

mostra:

Dê o nome ao Button de Cadastro de Pacientes. Dê um duplo clique neste botão para fazer a

chamada nele ao form de Pacientes:

O que fiz acima foi o mesmo feito no botão do Cadastro de Médicos: instanciei o formulário

paciente e usei o método ShowDialog para exibir o formulário no evento Click do botão.

Experimente adicionar alguns registros para testar as funcionalidades que o Visual Studio

nos fornece com apenas alguns cliques, como se pode ver, não é nada muito complexo de

ser feito.

Agora no form de Cadastro de Médicos, adicione um separador (Separator), mais um botão,

por meio das opções do ToolStripButton e, neste novo botão, clique com o botão direito

nele e clique em DisplayStyle > Text. Agora clique neste botão, abra as propriedades do

seu form, vá a propriedade Text e digite Fechar, como mostra a imagem abaixo:

Page 11: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Dê dois cliques neste botão e insira o método Close, como mostra a imagem abaixo:

Faça isso aos demais formulários, mantendo aquela idéia de criar uma padronização aos

forms.

Cadastro de Consultas – Crie um novo form e dê o nome de frmConsulta. Aplique as

configurações padronizadas que definimos no início do artigo, clique no evento KeyDown do

form e insira novamente o código para que o form se feche quando o usuário teclar ESC.

Abra a janela Data Sources (SHIFT + ALT + D), clique no botão ao lado de Consulta e

troque o formato dele para Details, como fizemos anteriormente.

Agora expanda a tabela Consulta e troque o formato

do IDConsulta para Label, IDMedicotroque para um ComboBox para que o usuário possa

escolher qual médico será mostrado no momento da consulta e faça o mesmo para a

coluna IDPaciente. E na coluna Ativo, deixe como None, porque não precisaremos mostrar

esta coluna ao usuário, ela servirá para controle interno, para sabermos se tal consulta está

ativa ou não.

Após isso, arraste a tabela Consulta para o form recém-criado:

Page 12: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Altere as propriedades do form para que fique igual ao da imagem abaixo:

No combo Nome do Médico e Nome do Paciente, altere a propriedade DropDownStyle

para DropDownList, para que o usuário não possa digitar nos combos. No combo Data,

altere a propriedade Format para Custom e a propriedade CustomFormat para

dd/MMM/yyyy. Nos combos Início e Término, altere a propriedade Format para Custom e

a propriedadeCustomFormat para HH:mm. Assim você coloca um valor personalizado tanto

para data quanto para hora. No textbox Observações, altere a propriedade Multiline para

True, para deixá-lo com várias linhas para inserir as observações. As demais configurações

seguem o padrão dos outros forms.

Agora volte ao form principal, adicione um novo botão, dê dois cliques nele e faça a chamada

ao formulário de Consulta por meio do código seguinte:

Agora, se compilarmos nosso sistema, veremos que o form de Consulta não nos retorna

absolutamente nada nos combos de Médico e Paciente.

Page 13: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Isso acontece porque não relacionamos as respectivas tabelas aos combos. Para fazer isso,

abra a janela Data Sources (SHIFT + ALT + D) e arraste a tabela Médicos para o seu

respectivo combo. Faça o mesmo com a tabela Paciente. Após isso, podemos clicar ao lado

do combo, na setinha e percebermos que ele arrasta os dados referentes ao médico para

este combo:

Agora rode o sistema e tente adicionar uma nova consulta.Poderá ocorrer dois erros, ou

esse:

Page 14: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

A imagem à esquerda mostra o erro, que diz que a data não permite valores nulos, para

arrumar isso, é só inserir a data como mostra à imagem a direita, selecionando o campo

combo e clicando no quadrado vermelho. Independente do primeiro erro, obrigatoriamente

irá ocorrer o erro abaixo:

Dizendo que a coluna Ativo não permite valores nulos. Para arrumar é só abrir o SQL Server,

onde foi criado nossas tabelas, clicar com o botão direito na tabela Consultas, clicar

emDesign e selecionar o checkbox na coluna Allow Nulls do campo Ativo, como mostra a

imagem abaixo:

Ainda não terminou! É importante salientar que, quando é feita alguma alteração no banco

de dados, como essa que fizemos, devemos realizar a alteração também em nosso

DataSet.

Para isso, salve, volte ao Visual Studio, abra o Solution Explorer, dê dois cliques no

seuConsultorioDataSet, clique na coluna Ativo, abra a janela Properties e, na

opção Allow DBNull, troque para True:

Page 15: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Salve, rode seu projeto e adicione um novo registro:

Ok pessoal, termina aqui mais um artigo da série que estou fazendo baseado nas videoaulas

de Luciano Pimenta, do Portal Linha de Código.

Na próxima parte de nosso artigo, iremos finalizar a padronização de nosso sistema

alterando o formulário principal e iremos nos aprofundar nas características principais

daProgramação Orientada à Objetos.

Assim conseguiremos projetar um sistema melhorado, com alta performance

simulando um sistema comercial para pequenas e médias empresas.

Nesta parte iremos finalizar nossa padronização no sistema aplicando algumas configurações

personalizadas ao formulário principal. Falaremos também sobre os conceitos

deProgramação Orientada à Objetos. Acompanhem:

Page 16: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

De início, vamos alterar as imagens dos menus do form principal. Para isso, abra o form,

clique nos botões do menu, se não tiver dado nome a eles, aproveite e já dê o nome de

Médicos, Pacientes e Consultas. Agora pesquise no Google Imagens as respectivas imagens

para cada botão, salve em seu pc, clique em cada botão e, no menu Propriedades, clique no

botão ao lado do atributo Image e clique em Import, como mostra a imagem abaixo:

Use de preferência imagens com tamanho máximo de 48×48. Após inserir as imagens clique

no atributo ImageScaling e o deixe como None para a imagem ficar com o tamanho real.

Se a imagem não ficar transparente, é só alterar a

propriedade ImageTransparentColor para a cor da sua imagem.

Podemos alterar nosso menu de navegação para que fique, por exemplo, à esquerda de

nossa janela e não em cima. Por meio da propriedade Dock podemos fazer isso, como

mostra a imagem abaixo:

Ok, no meu exemplo vou deixá-lo no topo mesmo, mais se preferir pode alterar a

propriedadeDock como mostrou a imagem.

A princípio, nosso formulário está pronto. Com cadastros e funcionalidades simples, nos deu

uma boa visão de como é fácil trabalhar com os controles do Visual Studio.

Page 17: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora imagine o seguinte cenário: uma aplicação dessa feita para a vida real onde, no

cadastro pacientes, não são 5 nem 10 nem 100 e sim 1000 registros.

Como ficaria se precisarmos navegar no registro 999, por exemplo? Iriamos de um em um?

Ficaria complicado, concordam? Por isso digo que até o momento montamos um sistema o

mais simples possível.

A partir de agora iremos mudar nosso foco e simular uma aplicação de verdade, para um

potencial cliente, utilizando alguns conceitos da Programação Orientada à Objetos, como

a Herança.

De forma simplista o conceito de Herança significa que uma ou mais classes filhas herdam

atributos e métodos da classe pai (conhecida também como classe base). A herança é usada

com a intenção de reaproveitar o código e assim garantir uma alta produtividade em nosso

sistema.

Vamos trabalhar também em nosso sistema com o conceito de Parametrização, que é o

conceito de implementar detalhes e parâmetros ao sistema de acordo com as necesssidades

do cliente. Seguindo este conceito, não teremos mais um formulário como o de Pacientes,

com os botões avançar e retroceder os registros, pois quando abrirmos o form de Pacientes,

não queremos ver todos os Pacientes e sim ver determinado Paciente.

Será feito assim em todos os formulários, por meio do conceito de Herança. Teremos

também um formulário de pesquisa. Comecemos então nosso formulário base principal que

será o “formulário pai”:

Clique em Add > Windows Form, dê o nome de frmBase e clique em OK.

Será gerado nosso formulário, clique nele, abra a janela Properties (F4) e altere as seguintes

propriedades:

- Start Position – coloque CenterScreen para que o form abra no meio da tela

- MaximizeBox – false

- MinimizeBox – false – para que só apareça o botão de fechar no form

- KeyPreview – true, para ativar o uso do teclado nos eventos do form

- FormBorderStyle – altere para FixedDialog para que o form não possa ser

redimensionado

Page 18: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora vamos inserir os controles que serão padrões nos demais forms. Arraste

uma ToolStripde nossa Toolbox para o form e insira 4 botões, 1 separador e mais 1 botão,

nessa ordem referentes aos botões Novo, Salvar, Excluir, Localizar e Fechar conforme

mostra a imagem abaixo:

Altere a propriedade DisplayStyle para Image and Text dos botões, a propriedade

ImageScaling para None e insira imagens para os botões referentes como fizemos no form

anterior. Altere também a propriedade Design dos botões para podermos identificá-los mais

facilmente quando formos usá-los na programação. Na ordem altere

para btnNovo,btnSalvar, btnExcluir, btnLocalizar e btnFechar.

Adicione o controle StatusStrip a seu form, nele adicione um StatusStripLabel, dê o nome

delblMensagem e deixe a propriedade Text em branco para que possamos configurar via

código uma mensagem ao usuário quando ele realizar determinada ação.

Clique com o botão direito no seu form e clique em View Code ou simplesmente

aperte F7para ir a página de códigos. Nela, vamos criar um enumerador, com os itens

Inserindo, Navegando e Editando, e criaremos uma variável privada deste enumerador para

sabermos qual é o status do sistema, se por exemplo o usuário estiver inserindo, devemos

desabilitar o botão de excluir, ou quando estiver localizando, devemos desabilitar o botão de

salvar.

Desta forma estaremos otimizando nosso código e evitando erros do usuário. A imagem

abaixo mostra nosso código:

Page 19: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Vamos voltar ao nosso form, no modo visual e implementar o código para o botão Fechar,

como parte de nosso exemplo. Primeiro dê dois cliques em cima do botão de fechar e chame

o método Close(). Depois, volte ao form, abra a janela de propriedades do mesmo, clique

nos Eventos, selecione o evento KeyDown, dê dois cliques nele e insira o código abaixo para

que o form se feche ao apertar ESC.

Usando esse conceito de Herança em nosso sistema, só utilizaremos este código acima

apenas uma vez e os demais herdarão as funcionalidades do formulário base, o que melhora

nosso desempenho e temos facilidade se precisarmos dar manutenção.

Na próxima parte de nosso artigo, iremos continuar a codificação de nosso formulário base

implementando os métodos que iremos usar na herança do mesmo.

Nesta parte vamos continuar com a codificação de nosso formulário base implementando os

métodos que iremos usar na herança visual dos demais.

Devemos ter a preocupação de, depois que o usuário gravar um registro por exemplo, os

controles usados, como combobox, textbox e outros, sejam limpados automaticamente.

Para isso devemos criar um método que limpa os campos após a gravação de um registro

qualquer.

Abra o frmBase.cs e crie um novo método do tipo private com o

nome LimpaControles que não irá nos retornar nada, como mostra a imagem abaixo:

Page 20: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Acima fiz um laço do tipo foreach na classe nativa Control (pertencente ao namespace

Windows.Forms) com o objetivo de ser feita uma “varredura” em meu formulário,

percorrendo todos os controles existentes dentro do meu form. A primeira verificação, por

exemplo, foi pra saber se existe um textbox em meu form e, se existir, ele será limpado. E

assim faço com os demais. Lembrando que em alguns controles, como Label e Button, não

tem necessidade de serem limpos. Conforme você for precisando adicionar ou substituir um

controle por outro é só adicionar o tipo dele em nosso foreach.

Se precisarmos fazer o mesmo a um controle do tipo CheckedListBox, devemos fazer outro

foreach, como mostrou nosso último if da imagem acima.

Continuando com nosso conceito de trabalhar com Herança, iremos criar os métodos Salvar,

Excluir e Localizar apenas neste formulário base, e iremos fazer a chamada desses métodos

nos demais formulários, poupando assim o retrabalho de ter que digitar o mesmo método

diversas vezes. Iremos começar criando o método Salvar.

Page 21: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Acima criei o método do tipo booleano passando como retorno o valor false, ele só me

retornará true quando o registro for salvo no banco. Faço o mesmo com os métodos Excluir

e Localizar.

Agora vá ao modo design do formulário base e dê dois cliques nos botões Salvar e Excluir.

Dentro deles insira o seguinte código:

O que fiz foi chamar os métodos referentes aos respectivos botões e dependendo da

resposta do método entro no meu if ou no meu else. Em minhas verificações coloquei o

método LimpaControles, pois ele irá entrar verificar se o registro foi gravado, por exemplo,

se foi ele limpa os controles e exibe a mensagem ao usuário, ou que o registro foi gravado

ou que deu erro, isso dependendo do que acontecer em nosso sistema.

Uma característica que será implementada é a de que quando forem abertos os formulários

sempre virão registros vazios, ou seja, se desejar um registro específico, o usuário terá que

localizar o mesmo por meio do respectivo botão. Depois de salvo um registro, por exemplo,

eles são automaticamente limpados.

Vamos agora implementar o enum que criamos no artigo anterior, em nosso botão Salvar.

Se o usuário salvou o registro ou excluiu, devemos configurar nosso enum para Navegando,

como mostra a imagem a seguir:

Devemos também dentro desses métodos fazer a chamada a outro que iremos criar para que

os controles sejam habilitados ou desabilitados.

Agora vamos criar os métodos para os botões Novo e Localizar que são iguais com os dos

botões Salvar e Excluir, como você pode perceber na imagem:

Page 22: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Lembrando que após criarmos nosso método que habilita/desabilita os controles do form

devemos implementá-lo aos botões Novo e Localizar.

Vamos criar um método que será implementado nos formulários que herdarão de meu

formulário base, que será o CarregaValores, a função dele será a de retornar os dados

parametrizados do banco e carregar meus controles, vou dizer que, por exemplo, o

campotxtNome irá vir carregado com a coluna de nomes do meu banco e assim por diante.

Faça a chamada a este método no botão Localizar.

Crie um novo método do tipo public virtual como os anteriores só que ele será do tipo void,

ou seja, não terá retorno algum. Crie também o método para habilitar / desabilitar os

controles no form, como a imagem abaixo nos mostra:

O que fiz foi um foreach, que percorre todos os meus controles, parecido com os do

métodoLimpaControles. Só que aqui ele faz um if pra verificar se o controle é

um Toolstrip, se for ele continua, se não for, ele habilita nossa variável bValue que foi

passada como parâmetro em nosso método.

Agora dentro deste mesmo método, faço as verificações em meus botões para habilitá-los ou

desabilitá-los.

Page 23: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Acima fiz o seguinte: passei o status de cada botão, por exemplo, no primeiro botão, o Novo,

atribui à ele que o status será o Navegando e assim fiz com os demais. No fim atribui que o

botão Fechar sempre estará habilitado. Assim, dependendo da ação do usuário o botão

específico estará habilitado ou desabilitado (com exceção do Fechar que terá valor fixo).

Agora é só aplicar os métodos aos respectivos botões passando os valores, true ou false,

dependendo de cada situação. Por exemplo, no botão novo, passo meu método com o

valortrue, porque quero habilitar os controles para que o usuário insira um novo registro, já

no botão excluir, passo o valor false ao meu método porque já exclui, não preciso mais que

os controles sejam habilitados e assim sucessivamente. Abaixo um exemplo do botão

Localizar:

Finalizando, vá ao modo Design de nosso form e dê dois cliques no form para ir ao

eventoLoad do mesmo. Nele, insira os seguintes códigos:

Page 24: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Fazendo isso, toda vez que o form for carregado ele iniciará com o status Navegando, com

os controles limpos e com o método HabilitaDesabilitaControles como false. Assim

inicializamos os métodos em nosso form de uma forma prática e sem erros, permitindo ao

usuário praticidade e performance na hora de navegar nos formulários.

Para quem se interessar, estou disponibilizando para download o que fizemos até esta parte

do artigo em nosso sistema. Para baixar, clique aqui.

Nesta parte vamos montar nossa tela base de pesquisa, que será parametrizada, ou seja,

nos retornará apenas o que pesquisarmos e não toda a nossa base de dados, o que em uma

aplicação real nos traria muita dor de cabeça se não fosse usado o recurso de

parametrização que estamos implementando. Nossa tela de pesquisa será também genérica.

Montaremos a tela padrão e, a partir dela, serão montadas as telas herdadas que forem

necessárias no decorrer de nossos artigos. Com isso ganharemos e muito em performance

em nosso sistema.

Abra sua solution e clique em Add > New Windows Form. Dê a ele o nome

defrmPesquisaBase, pois este será o nosso formulário base de Pesquisa.

Será gerado nosso formulário, clique nele, abra a janela Properties (F4) e altere as seguintes

propriedades:

- Start Position – coloque CenterScreen para que o form abra no meio da tela

- MaximizeBox – false

- MinimizeBox – false – para que só apareça o botão de fechar no form

- KeyPreview – true, para ativar o uso do teclado nos eventos do form

- FormBorderStyle – altere para FixedSingle (faça o mesmo nas propriedades do formulário

Base)

- ShowInTaskbar – false, para não mostrarmos o form no taskbar

Adicione o controle StatusStrip a seu form (da mesma forma como fizemos no formulário

base) , nele adicione um StatusStripLabel, dê o nome de lblMensagem e deixe a

propriedade Text em branco para que possamos mostrar ao usuário qual foi a quantidade de

registros retornados após ele ter feito uma pesquisa.

Nosso formulário terá duas formas de pesquisar: ou pelo código do usuário, ou pela

descrição. Vamos adicionar um GroupBox ao nosso form e dar o nome de Tipo de

Pesquisa, como mostra a imagem a seguir:

Page 25: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora dentro dele adicione dois RadioButton com as propriedades

Text Código e Descrição. Altere o ID de cada um deles para rbtCodigo e rbtDescricao,

respectivamente e deixe a propriedade Checked do RadioButton Descrição setada

para True, para que o form sempre inicialize com ele checado, que é o mais comum de se

pesquisar.

Adicione também, ao lado do GroupBox, um Label, um TextBox e um Button, para que o

usuário possa digitar no campo a descrição referente ao usuário. Altere o ID deles

paralblDescricao, txtPesquisar e btnPesquisar. Deixe seu form como o da imagem

abaixo:

Page 26: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora adicione dois botões no canto inferior direito do seu form, um que é o botão OK e

outro o botão Fechar. Dê dois cliques no Fechar e chame o método Close. A esses botões

sete a propriedade DialogResult de cada um como OK e Cancel, respectivamente, como

mostra a imagem a seguir:

Agora abra o evento KeyDown do seu form e coloque aquela verificação para que, quando o

usuário pressionar ESC ou ENTER, o form se feche. Sete o valor do DialogResult para

Cancel, como mostra a imagem abaixo:

Page 27: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora vamos implementar um ListView ao nosso formulário. Então abra a Toolbox, arraste

um controle ListView ao form e dê a propriedade ID o nome lstPesquisa. Ainda nas

propriedades, altere a propriedade View para Details e abra a opção Columns para

adicionar duas colunas ao nosso ListView. Clique em Add e altere a propriedade Text para

Código, faça o mesmo na próxima, dê o nome Descrição e clique em OK. Redimensione sua

coluna Descrição se desejar. Altere a propriedade FullRowSelect para True para que,

quando o usuário clique no campo Descrição, por exemplo, seja selecionado toda a linha e

não só o campo clicado. Altere para True também a propriedade GridLines, para que nosso

ListView fique com as linhas do Grid. Finalizando o design de nosso ListView, altere a

propriedadeMultiSelect pra False, porque queremos que seja selecionado apenas uma linha

de nosso grid e não várias. Se você alterou as propriedades como descrito, seu ListView deve

estar parecido com o da imagem a seguir:

Page 28: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Vamos implementar as funcionalidades de nosso ListView entrando na página de códigos do

formulário. Vamos criar uma classe pública do tipo string e a inicializaremos com um valor

vazio, para que ela seja preenchida em outras partes de nosso código, como quando o

usuário escolher um código em nossa Grid e clicar em OK ou mesmo quando ele der dois

cliques no Grid. Vejamos o código:

Agora volte ao modo Design do form e dê dois cliques no botão OK. Insira o seguinte código:

O que fizemos no botão OK tivemos que fazer também no

evento SelectedIndexChanged do ListView só que usamos um Try/Catch para tratar um

erro que não é da aplicação e sim do próprio controle. No evento DoubleClick do ListView

devemos usar o código para preencher nossa variável e adicionarmos o método Close e

o DialogResult com o valor OK, como fizemos no evento KeyDown do formulário

anteriormente. A imagem a seguir mostra nosso método:

Page 29: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Dessa forma, capturamos praticamente todas as opções que o usuário tem no momento em

que vai pesquisar. Seja no clique duplo no resultado da pesquisa, seja no botão OK, seja

quando o foco está na pesquisa do usuário.

Para quem se interessar, estou disponibilizando para download o que fizemos até esta parte

do artigo em nosso sistema. Para baixar, clique aqui.

Nesta parte vamos criar os métodos para que o ListView nos retorne o que o usuário digitar

no campo de Pesquisa. Iremos também criar um novo DataSet e deixarmos de lado o

criado nos artigos anteriores.

Vamos começar criando nosso método de Pesquisa, no arquivo de códigos de nosso

formulário de Pesquisa crie um método do tipo público virtual e que não irá ter

retorno(void). Não iremos implementar nada neste método, já que serão implementados

apenas nos formulários herdados. Ou seja, em cada formulário de pesquisa terá uma

implementação diferente, como a pesquisa de clientes, por exemplo.

Agora vamos ao modo Design de nosso formulário. Quero que meu botão de Pesquisa seja

chamado quando o usuário digitar algo na caixa de pesquisa e der um ENTER. Ou seja, este

será o botão padrão de nosso form. Para isso, clicamos em nosso form e, na

propriedadeAcceptButton, escolhemos nosso btnPesquisar, como a imagem abaixo nos

mostra:

Page 30: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Dê dois cliques no botão Pesquisar para voltarmos à página de códigos de nosso form. No

evento Click desse botão chame o método Pesquisar, faça a configuração de

nossaStatusStrip, que criamos anteriormente, para retornar ao usuário quantos registros

foram encontrados em cada pesquisa que for feita e adicione outras implementações, como

mostrado na imagem abaixo:

Além das implementações citadas acima, como você pode ver na imagem, adicionamos mais

duas verificações, uma que habilita o botão OK de nosso form se a propriedade Count for

maior que 0, ou seja, se nosso ListView nos retornar ao menos 1 registro em nossa

pesquisa, e a outra que, se o botão OK estiver habilitado, faz com que nosso ListView ganhe

o foco. Esta última é necessária porque, assim o usuário pode navegar entre os registros

usando as setas do teclado, dando duplo clique para ver determinado registro por exemplo e

assim estaremos evitando ao máximo possível erros do usuário.

Agora vamos criar um método que irá carregar o retorno de nossa pesquisa da base de

dados em nosso ListView. Crie o método do tipo público void e que terá como parâmetro um

DataTable, que será implementado em nossos formulários que herdarão do formulário base.

Veja o método a seguir:

Page 31: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Com este método, finalizamos nossos métodos do formulário de Pesquisa, agora volte ao

modo Design, clique nos Radio Buttons Código e Descrição, vá ao evento Click, dê dois

cliques e insira o seguinte código:

Apenas para que o usuário tenha uma maneira rápida e fácil de pesquisar, melhorando assim

a eficiência de seu sistema e a usabilidade do mesmo.

Lembrando que para cada formulário de pesquisa, teremos dois tipos de pesquisa: por

código ou por descrição. Com isso em mente, iremos criar um novo DataSet e deixaremos

de lado o que foi criado em artigos anteriores, pois nele usamos as facilidades do Visual

Studio para criá-lo, já nesse estamos usando um outro tipo de abordagem, tendo como base

o conceito de Programação Orientada à Objetos. Dito isto, abra a Solution

Explorer (CTRL+W+S), clique em seu projeto com o botão direito e clique em Add > New

Item. Escolha no menuCategories a opção Data, no menu Templates escolha DataSet, dê

o nome dsConsulta e clique em OK.

Page 32: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Será um DataSet igual ao nosso criado nas primeiras aulas, a diferença é que desta vez não

iremos usar o menu DataSources para arrastar as tabelas. Vamos arrastar diretamente do

banco por meio do Server Explorer, assim ele criará para nós

cada DataTable eDataAdapter referentes às respectivas tabelas para que possamos

customizá-las.

Então abra o Server Explorer (CTRL+W+L), expanda seu Database Consultorio, seu menu

Tables arraste as tabelas para o DataSet recém criado. Seu DataSet deverá ficar como o da

imagem abaixo:

Vamos customizar a tabela de médico para criar mais duas pesquisas, uma por código e

outra por nome/descrição. Para isso, clique com o botão direito no MedicoTableAdapter da

tabelaMedico e clique em Add Query. Irá abrir um wizard que nos perguntará como nossa

query irá acessar o banco, existem três opções: por meio de instruções SQL, por meio da

criação de uma Stored Procedure ou por meio do uso de uma Stored Procedure existente.

Neste caso, escolha a 1ª opção e clique em Next.

Page 33: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Na próxima tela, devemos informar qual tipo de consulta iremos realizar dentre cinco

opções: se será por meio de um SELECT que retornará vários registros, se será por um

SELECT quer retornará apenas 1 registro, se iremos usar a instrução UPDATE, que atualiza

os dados, se iremos usar a instrução DELETE, que apaga os dados ou se será por meio da

instruçãoINSERT, que insere os dados. Escolha a 1ª opção e siga em frente.

Page 34: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Aqui ele já me traz a instrução SQL pronta. Note o botão Query Builder, com ele podemos

fazer instruções mais complexas, com o uso de Join, Group By, etc. Como a nossa consulta

será parametrizada, volte a instrução SQL e altere a instrução passando o parâmetro como

mostra a imagem a seguir:

Page 35: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Nesta tela, devemos escolher quais métodos devemos usar em nosso TableAdapter. A 1ª

opção, Fill a DataTable, como o próprio nome diz, preenche o DataTable e a 2ª

opção,Return a DataTable, apenas retorna o DataTable preenchido. Podemos usar os dois,

mais neste exemplo (como estou seguindo à risca as videoaulas de Luciano Pimenta) iremos

escolher somente a 1ª opção e dar o nome de PesquisaID.

Page 36: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

A próxima tela mostra que o Wizard gerou a instrução SQL e o método de preenchimento.

Clique em Finish. Perceba na imagem abaixo que foi criada nossa query parametrizada, ou

seja, ela pede como parâmetro o ID do Médico:

Agora crie um Wizard igual esse que criamos, apenas mude nossa instrução SQL, já que

nesse pesquisaremos pelo nome. Como podemos pesquisar por apenas uma parte do nome,

use a cláusula Like, como a imagem abaixo nos mostra:

Page 37: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Na próxima tela, selecione o método Fill e dê o nome PesquisaNome. Pronto, agora temos

as duas consultas criadas. Agora vamos fazer um teste.

Primeiramente, dê um Build Solution (F6) na sua aplicação. Agora abra o Form1.cs e

adicione o seguinte código:

Fiz a chamada a meu DataSet por meio do using e, no método Load do meu formulário,

instanciei o MedicoDataTable, instanciei o MedicoTableAdapter, que foi na onde criei

minhas duas pesquisas e, por meio dele, fiz a chamada ao método PesquisaID, referente à

pesquisa criada passando como parâmetro meu MedicoDataTable e um valor inteiro

qualquer, nesse caso o 1. Por meio do meu método Rows, tenho acesso a coluna da minha

tabela Medico, para isso usei o dt, que é a instância de meu DataTable e chamei o método

Rows, passando como parâmetro o índice 0, que seria o 1º registro e nome da coluna, que

Page 38: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

neste caso éID_MEDICO. Iremos fazer basicamente isso em nossas outras consultas. Esse

exemplo iremos usar em nosso Cadastro, já a outra consulta que criamos usaremos em

nosso formulário de Pesquisa.

Finalizando, apague estes códigos do método Load desse form, já que isso nos serviu

apenas de exemplo para implementarmos nas consultas e pesquisas dos outros formulários.

Para quem se interessar, estou disponibilizando para download o que fizemos até esta parte

do artigo em nosso sistema. Para baixar, clique aqui.

Nesta parte iremos continuar a customização de nossas tabelas e sobrescrever os métodos

para o formulário de Cadastro de Pacientes. Acompanhe:

Como feito no artigo anterior, vamos criar um TableAdapter, só que desta vez para a

tabela de Pacientes. Então, clique com o botão direito no TableAdapter da tabela Paciente e

clique em Add Query. Faça isso com os dois tipos de pesquisa, como no form de Medicos,

por ID e por Paciente. Altere a instrução SQL da consulta por ID, como mostra a imagem

abaixo e clique em Next:

Na próxima tela, ao invés de escolhermos a opção Fill a DataTable, vamos escolher a outra

opção, Return a DataTable, com o nome PesquisaID para vermos as diferenças. Escolha

e clique em Next, depois em Finish.

Page 39: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora crie outra query e faça o mesmo que a query anterior, só altere a instrução SQL, como

a da imagem a seguir:

Page 40: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Escolha o método Return a DataTable e dê o nome de PesquisaNome. Pronto, nosso

DataSet está concluído.

Agora vamos criar os formulários que herdarão dos formulários base que foram criados.

Salve e dê um Build Solution (F6) no seu projeto para ter certeza de que o mesmo não

está com erros. Agora clique com o botão direito no seu projeto e clique em Add > New

Item. Não iremos adicionar um Windows Form normal e sim um Inherited Form, que

Page 41: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

traduzindo seria um Formulário Herdado que, como o próprio nome diz, herdará de outro

formulário, neste caso do Paciente. Dê um nome sugestivo a ele e que não seja o mesmo

nome dos formulário já criados. No exemplo dei o nome frmPacienteHerdado. Irá aparecer

outra janela perguntando de qual form iremos herdar, escolha o frmBase, que é o que tem

todas as características que precisamos, e clique em OK. Como você pode notar abaixo,

temos os mesmos controles do frmBase, o que precisamos fazer no momento é adicionar

alguns controles.

Adicione 4 labels e 2 textboxs, deixe o label que ficará em cima do textbox sem nome, pois

ele será preenchido com os dados que vierem do banco. No modo design dê o

nome lblCodigo à ele, txtNome e txtTelefone aos textboxs. Deixe seu formulário como o

da imagem abaixo:

Page 42: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora precisamos sobrescrever os métodos que, no formulário base, foram declarados

comovirtual, como o Salvar, Excluir, Localizar e Carregar Valores. Para isso,

aperte F7 nofrmBase para ir a página de códigos. O Visual Studio nos dá uma grande ajuda

quando queremos sobrescrever métodos já criados. Quando digitamos public override e

damos um espaço, o VS já nos traz todos os métodos que podemos utilizar do outro form,

incluindo os que criamos, como você pode perceber na imagem a seguir:

Chame o método Salvar e exclua o return base.Salvar(), pois não iremos usá-lo. Aqui

iremos chamar nosso DataSet criado anteriormente, antes disso declare-o por meio

do using. Como meu método espera um valor booleano, eu preciso declarar uma variável do

tipo bool e deixá-la como false, valor padrão. Após isso, instancio

o PacienteTableAdapter e agora preciso chamar meu enumerador sStatus, se lembra

dele? Mais aqui tem um problema: como ele foi declarado como private, não consigo

chamá-lo aqui, já que ele é privado a sua classe. Para isso, altere o modificador dele

para public. Agora sim, complete o método abaixo, veja a imagem com os comentários do

que foi feito:

Page 43: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Esta verificação é para quando estiver inserindo. Mais, e quando o registro já foi inserido e

quero apenas atualizá-lo? Para isso, faço como na imagem a seguir (ainda dentro do meu

método Salvar):

Como você pode perceber, o método Update vai dar erro porque ele espera ao menos 5

parâmetros a serem preenchidos. Porque ele está pegando todos os campos de minha tabela

e está tentando comparar com os campos do meu método. Para alterarmos isso, temos que

ir ao DataSet, clicarmos com o botão direito em Fill, GetData(), de meu

PacienteTableAdapter, e clicarmos em Configure, como mostra a imagem:

Page 44: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora clique em Advanced Options e desmarque as opções Use optimistic

concurrency eRefresh the data table, como você pode ver abaixo:

De OK, Next, Next e Finish. Volte ao método Update e note que agora não irá mais dar erro.

Veja como deve ficar método completo abaixo.

Page 45: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Dê um Build Solution (F6) apenas para ter certeza que sua solução está sem erros e salve

o projeto.

Agora vamos sobrescrever o método Excluir. Faça como o anterior:

Apenas chame o método Localizar, já que não vamos implementá-lo agora.

Agora, antes de chamar o método que carrega os itens vamos imaginar o seguinte: já que

em meus métodos eu preciso passar meu lblCodigo, referente ao código do paciente, não

seria melhor se eu declarasse uma variável que fosse a responsável por este código?

Pensando assim, vamos criá-la no nosso formulário base. Abra o frmBase, vá a página de

código e declare o código:

Desta forma, todos os meus cadastros herdarão essa variável, que representa o código

respectivo de cada cliente de meu consultório. Assim, posso usá-la nos

métodos Localizar,Excluir e Salvar, substituindo pelo lblCodigo, já que não precisamos

usá-lo mais. Por enquanto vamos deixar como está.

Agora chame o método CarregaValores e dentro dele coloque o seguinte código:

Page 46: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Aqui usamos aquela consulta que filtra pelo ID do Paciente, que criamos anteriormente em

nosso DataSet. Para isso, declarei o DataTable e o TableAdapter e fiz com que o

DataTable retornasse meu TableAdapter com o método PesquisaID passando como

parâmetro minha variável nCodGenerico, que será preenchida pelo método Localizar,

lembrando que o Localizar que irá chamar meu método CarregaValores.

Após isso eu verifico, se o DataTable retornou algum registro, preencho os controles de tela.

Lembrando que esse CarregaValores será implementado em cada formulário específico.

Vamos criar agora um novo formulário, que herdará do de Pesquisa. Vá na Solution, clique

emAdd > New Item, em Categories escolha Windows Forms, escolha o

template Inherited Form, dê o nome de PesquisaPaciente, clique em Add e escolha

o frmPesquisaBase, já que nosso form criado herdará dele.

Volte ao formulário que estávamos, porque agora vamos implementar o método Localizar.

Digite o seguinte código:

O que fiz foi, instanciei o formulário herdado de Paciente, verifiquei se o DialogResult desse

form foi igual a OK como configurado no formulário base, ou seja, se o usuário escolheu

algum registro no formulário e clicou em OK e, se sim, passamos a variável bLocalizar o

valor daquela variável sCdCodigo (que é a responsável pelo código da pesquisa no

formulário base), diferente de vazia. Após isso, fazemos outra verificação. Se isso for

verdade, ou seja, se a variável bLocalizar obtiver algum registro, minha

variável nCodGenerico receberá o valor de sCdCodigo. Acima fiz também

Page 47: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

um int.Parse para converter, pois a variável sCdCodigo é do tipo string e a nCodGenerico,

do tipo int.

Exemplo: o usuário está navegando entre os registros, decide escolher um e clica em OK.

Neste momento meu DialogResult é “setado” para OK. Quando isso acontece, faço estas

verificações, o bLocalizar recebe o valor de sCdCodigo, que na verdade é o código

escolhido. Ele é diferente de vazio? é, então foi preenchido, o que significa que minha outra

variável, anCodGenerico irá receber o sCdCodigo. Simples né?!

A partir de agora, podemos utilizar esta variável nCodGenerico em outros locais para

substituir meu código. No método CarregaValores já estamos usando ela. Vamos fazer o

mesmo no método Excluir e no método Salvar:

Nosso formulário de Cadastro está implementado.

Finalizando nosso artigo, vá ao Form1, dê dois cliques no botão Paciente e altere o código

para chamar nosso formulário. Agora será chamado nosso formulário herdado. Faça como a

imagem abaixo nos mostra:

Salve seu projeto e compile para testar se tudo saiu OK.

Para quem se interessar, estou disponibilizando para download o que fizemos até esta parte

do artigo em nosso sistema. Para baixar, clique aqui.

Nesta parte iremos implementar o método Pesquisar, do formulário de Pesquisa, referente

aoCadastro de Pacientes para que, assim, nosso cadastro esteja completo usando os

Page 48: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

conceitos de Herança Visual de formulários. Iremos começar também uma simulação do

padrão MVC(Model View Controller) em nosso sistema. Confira:

No formulário de Pesquisa, vamos fazer o seguinte: de acordo com o tipo de pesquisa que o

usuário escolher (por ID ou Descrição), iremos utilizar um dos métodos criados

anteriormente em nosso DataSet.

Abra o formulário frmPesquisaPaciente e sobrescreva o método Pesquisar, como mostra a

seguir:

Após isso, dentro do método criado, tente acessar o campo de pesquisa, herdado do

formulário base, que se chama txtPesquisa. Você verá na imagem abaixo que não será

possível o acesso ao mesmo.

Isso acontece porque, por padrão, o modificador de acesso dos controles é do tipo privado

(private), precisamos então acessar o formulário base e alterá-lo para público (public),

como mostra a imagem:

Faça o mesmo com os RadioButtons Código e Descrição e aperte F6 para dar um Build

Solution. Toda vez que você precisar acessar um controle herdado desta forma, é preciso

alterar o modificador para public no formulário base.

Page 49: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora volte ao formulário de pesquisa e note que você terá acesso ao textbox de pesquisa e

aos radiobuttons. Altere o nome de seu formulário de pesquisa para Pesquisar Paciente e

volte ao código.

Dentro do método sobrescrito Pesquisar, faça o seguinte código:

O que fiz acima foi uma verificação simples, Se o usuário selecionar o RadioButton Código,

passo ao DataTable o método PesquisaID, criado no DataSet anteriormente, para ser

pesquisado o ID que o usuário digitar no campo de pesquisa. Senão, ou seja, se o usuário

selecionar o RadioButton Descrição passo ao DataTable o método PesquisaNome, e uso a

porcentagem (%) entre o campo de pesquisa, que significa que ele irá procurar uma parte

do nome.

Se eu tiver no banco um nome Carlos, por exemplo e digitar no campo rlo, ele irá me

retornar o nome Carlos no ListView, pois com esse parâmetro de porcentagem, da

cláusula Like (que irei abordar mais a frente no curso de SQL do meu blog), ele irá procurar

por partes referentes ao nome pesquisado. Como meu DataSet não aceita/entende o

parâmetro %, preciso declará-lo em meu código. Agora salve e compile sua aplicação. Clique

em Pacientes e deverá aparecer a tela de Cadastro de Paciente. Clique em Novo, digite um

nome e um telefone qualquer e clique em Salvar.

Page 51: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Acima digitei uma parte do nome, ele já me retornou o nome completo e o ID. E abaixo me

mostrou quantos registros foram retornados com essa parte do nome. Se você der dois

cliques em cima do nome, ele trará a tela de Cadastro com o Nome e o ID preenchido:

Como você perceber na imagem acima, os botões de Salvar e de Localizar estão

desabilitados, precisamos alterar algumas configurações para que os botões sejam

habilitados. Para isso, vá ao formulário Base, vá ao método HabilitaDesabilitaControles e

perceba que no botão Localizar só esta habilitado o Status Navegando, adicione também

oEditando e o Inserindo. No botão Salvar, está habilitado o

Status Navegando e Inserindo, falha minha, o correto seriam os

Status Editando e Inserindo. Arrume os botões como mostra a imagem a seguir:

Salve e compile seu projeto. Clique em Pacientes e no botão Localizar. Digite um nome

qualquer na caixa de busca ou a deixe em branco e tecle ENTER. Você verá o resultado da

pesquisa:

Page 52: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Clique em um dos resultados da pesquisa. Se quisermos com que, quando o usuário

teclarESPAÇO sobre um dos resultados, o formulário de pesquisa se feche e abra o

respectivo registro, podemos implementar isso fazendo o seguinte: Abra o formulário

de Pesquisa Base, clique em cima do ListView, vá a janela de Propriedades e, no

evento KeyDown, dê dois cliques e adicione o seguinte código:

PS: tentei fazer este método com a tecla ENTER, mais por uma razão desconhecida, não

consegui fazer funcionar. Se alguém descobrir o porque, por favor poste nos comentários.

Agora escolha um registro qualquer, abra-o e clique em Excluir. Como você pode perceber,

a exclusão é feita em poucos segundos. O interessante seria perguntarmos ao usuário se ele

realmente deseja excluir o registro, mantendo assim uma certa padronização em

formulários. Para isso, vá ao formulário Base, entre no botão Excluir, e altere o código para

que fique desta forma:

Page 53: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Acima fiz apenas a pergunta ao usuário se deseja excluir o registro com o uso de

MessageBox. Se ele clicar em não, nada acontecerá. Se ele disser sim, ele entrará no

método Excluir, que já foi implementado anteriormente e o usuário verá um MessageBox

avisando que o registro foi excluído. Simples.

No decorrer dos artigos iremos verificar o que está faltando ou até os erros que possam vir a

ocorrer para que assim possamos alterá-los/modificá-los e nosso sistema fique com o menor

número de inconsistências possíveis.

Salve o projeto, compile, clique para excluir um registro e veja as modificações.

Vamos começar a partir de agora uma simulação do padrão MVC (Model View Controller),

onde nosso DataSet será o Model e os formulários são o nosso View. Precisamos criar agora

o Controller, que serão as classes que farão a abstração dos dados da Model e irá fazer a

“ponte” com a View, ou seja, com essas classes poderemos abstrair os dados do nosso

DataSet e onde faremos a implementação dos métodos que os formulários irão chamar.

Para mais informações sobre o padrão MVC, acesse os links abaixo:

http://pt.wikipedia.org/wiki/MVC

http://www.macoratti.net/vbn_mvc.htm

http://msdn.microsoft.com/pt-br/magazine/cc337884.aspx

http://www.linhadecodigo.com.br/Artigo.aspx?id=1602

http://imasters.uol.com.br/artigo/12139/asp/asp_net_mvc_compreendendo_models_views_

e_controllers/

Começaremos criando a classe de acesso a dados, que irá implementar alguns métodos e

criaremos as classes que herdarão estes métodos.

Na Solution Explorer, clique em Add > Class e dê o nome AcessoDados a sua classe.

Page 54: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Lembrando o conceito de Herança, esta classe será nossa classe Base, onde a partir dela

serão criados outras classes que herdarão os métodos provenientes dela. Aqui iremos ter os

métodos para Salvar, para Excluir, Pesquisa por ID e Pesquisa por Nome, seguindo

nossa lógica do sistema.

No nome da sua classe acrescente um public antes, para que ela possa ser acessada pelas

classes herdadas e crie o método virtual de Salvar, que será sobrescrito depois.

Como você pode perceber, o método Salvar recebe um parâmetro booleano, que irá indicar,

dependendo do status, se o registro está sendo inserido ou alterado. Como fiz nos outros

métodos do tipo bool, inicializarei este método com o valor false como retorno. Crie

também um método virtual booleano com o nome Delete. Este método não terá nenhum

parâmetro, já que função é apenas de excluir um registro.

Agora vamos criar um método do tipo DataTable para pesquisar por ID, que receberá como

parâmetro um valor do tipo int. Antes disso, é preciso declarar o namespace System.Data,

para que possamos usar o tipo DataTable.

Após isso, faça o seguinte método:

Page 55: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Faça também um método do tipo DataRow, que irá me retornar somente uma linha, para

pesquisar pelo ID, passando como parâmetro um valor do tipo int, parecido com o método

anterior. A diferença deste é que irá me retornar um DataRow e não um DataTable.

Assim podemos fazer pesquisas que irão retornar somente uma linha e também pesquisas

que irão retornar diversas linhas. Desta forma tenho várias formas de pesquisar em meu

sistema. Desta forma, posso declarar dois métodos com o mesmo nome, só que com o

retorno e parâmetro diferente (ou nesse caso, sem parâmetro).

Finalizando, faça um método do tipo DataTable para pesquisar por nome, que terá um

parâmetro do tipo string, que receberá o nome pesquisado.

Assim teremos métodos para Salvar, Excluir, Pesquisar por ID e Pesquisar por Nome.

Para quem se interessar, estou disponibilizando para download o que fizemos até esta parte

do artigo em nosso sistema. Para baixar, clique aqui.

Nesta parte iremos criar as classe e os métodos que herdarão da minha classe de acesso a

dados. Confiram:

Crie a classe AcessoDadosPaciente, que herdará da nossa classe de acesso a dados. Agora

vou mapear os campos da minha tabela como propriedades dessa minha classe herdada.

Declare a propriedade privada _nCodPaciente:

Para que ela se torne um campo, precisamos usar o Refactor do Visual Studio (ou você

pode fazer na mão). Para isso clico com o botão direito em cima dessa propriedade privada,

clico em Refactor > Encapsulate Field e dou um nome diferente a ela (geralmente seria o

nome quase igual da propriedade privada apenas sem o underline), como mostra a imagem

a seguir:

Page 57: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Antes de fazer o método sobrescrito de Salvar, declarei

oConsultas.dsConsultaTableAdapters. Após isso, crio o método Salvar, muito parecido

com o que foi feito em outras páginas do projeto, só que a diferença será que agora a nossa

classe de Acesso a Dados que irá abstrair esse método. Assim declaro minha

variável bSalvar, instancio o TableAdapter, faço a comparação descrita na imagem acima:

se estiver gravando no banco, chamo o ta.Insert, passando os parâmetros declarados em

nossa classe, referentes ao nome do paciente e ao numero do telefone. Uso no final o maior

que 0 apenas para dizer que minha variável bSalvar será gravada/atualizada somente se

houver algum registro, ou seja, se for maior que 0. Se não estiver gravando no banco, está

atualizando, então chamo o ta.Update, faço a mesma coisa, só que passo 3 parâmetros: o

nome do paciente, o número do telefone e o código do paciente.

Lembrando: preciso preencher essas propriedades antes de chamar esse método de Inserção

e/ou Atualização.

Fazendo desta forma, meus formulários não precisam acessar diretamente

o TableAdapterpara obter os dados, já que minha classe de Acesso a Dados fará isso.

Como teste, abra o formulário Paciente Herdado e vá ao método Salvar. Vamos

experimentar usar o método de nossa classe de Acesso a Dados. Para isso, comente o código

do botão de Salvar do formulário e faça o seguinte código:

Page 58: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Comentei todo o código que usávamos para Salvar e, apenas instanciando a classe de

Acesso a Dados, fiz o mesmo método, preenchendo as propriedades e passando os

parâmetros. Além de economizar linhas de código, uso o conceito de MVC, já que dessa

forma meu formulário não precisa usar os métodos de acesso a dados diretamente. Ele

apenas chama a classe responsável por isso, no caso a de Acesso a Dados. Outro ponto

importante a se destacar é o fato de que, quaisquer validações que precisarmos fazer, é só

fazer nas classes de dados. Assim não precisaremos se preocupar em ir, formulário a

formulário, validando o que precisa, só fazemos uma única vez. Mais pra frente, quando

formos implementar essa forma de trabalhar com MVC nos outros métodos, não

precisaremos mais chamar o TableAdapter em nosso form como chamamos atualmente:

Vamos agora sobrescrever os outros métodos. Volte a classe de Acesso a Dados e, logo

abaixo do método Salvar, chame o método Delete e insira o seguinte código (muito parecido

com o código do método Salvar):

Chame agora o método PesquisaID (o que tem parâmetro), que é parecido com o método

Delete (a diferença é que nele usamos o parâmetro nCodGenerico e precisamos instanciar

o DataTable, além é claro do TableAdapter) e insira o seguinte código:

Page 59: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Chame o PesquisaID. Como este método não possui parâmetros, vamos chamar os

atributos declarados no início de nossa classe, referentes as colunas de nossa tabela. Insira o

seguinte código:

Como o método é do tipo DataRow, apenas retorno o DataTable PesquisaID, que fizemos

anteriormente, e passo o comando Rows[0], que indica que quero pegar o 1º índice (ou 1ª

linha) de meu DataRow.

Simples né? Agora vamos ao PesquisaNome, que é praticamente igual ao PesquisaID (com

parâmetro), só precisamos trocar o parâmetro, que é string, e o método:

Pronto, os métodos estão sobrescritos.

Temos situações em que, precisamos passar todos os campos, outras em que precisamos

passar o nome e o telefone, outros em que preciso passar somente o código, quando for

Pesquisa, por exemplo, etc. Para não ter o trabalho de sempre ter de preencher todas as

propriedades, devemos sobrescrever o construtor da minha classe, desta forma:

Desta forma, em branco, sem receber nenhum parâmetro nem valor.

Agora, crio outros construtores, analisando aquelas situações descritas acima, em que posso

passar apenas o código, ou o nome e telefone, etc. Confira:

Page 60: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Assim não terei o trabalho de instanciar as classes, chamar as propriedades e preenchê-las,

já meu construtor servirá pra isso.

Dessa forma, teremos 4 construtores: um que não terá parâmetro algum, um que terá o

código do paciente, para quando precisarmos fazer Pesquisas por ID, um que passo o código,

o nome e o telefone, quando for atualização, por exemplo, e um construtor que passarei

somente o nome e o telefone, quando for uma inserção. Assim percebam que podemos

customizar nossas classes de acordo com nossas necessidades.

Os valores que são passados como parâmetros, são repassados às propriedades criadas no

começo do código.

Vamos então fazer as modificações necessárias nos outros métodos de nosso

formulárioPaciente Herdado, como fizemos com o método Salvar acima.

Abra esse form, abra o método Delete e faça o digite o seguinte código:

Primeiramente, comente (ou exclua) o using acima, já que não iremos mais utilizar o

DataSet nessa página, pois nossa classe de Acesso a Dados que é a responsável por se

conectar ao banco. Agora instanciamos a classe, usamos o 2º construtor que criamos, que

tem como parâmetro o código, então passamos o _nCodGenerico, que é preenchido pelo

Localizar e o usaremos para Excluir o registro. Finalizando apenas retorno o método Delete,

criado na classe. Em resumo, tenho uma produtividade no código, pois o que antes

gastávamos 4 linhas, hoje gastamos apenas 2. Pode parecer pouco, mais imagina em um

sistema grande, com milhares de páginas e linhas de código. Isso aumenta e muito a

produtividade e a facilidade de dar manutenção, caso ocorra algum erro.

O método Localizar não iremos alterar neste form, já que precisamos alterá-lo no form

dePesquisa. Vá ao método CarregaValores e insira o seguinte código:

Page 61: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Aqui eu instancio minha classe, passo como parâmetro o _nCodGenerico, da mesma forma

que o método Excluir, instancio um DataRow(que retorna apenas uma linha), passo a ele a

classe instanciada chamando o método PesquisaID, aquele método sem parâmetro, já que

quero apenas retornar uma linha. Senão passaria o outro método, do tipo DataTable. Depois

verifico, se o DataRow for diferente de nulo, preencho os campos que desejo, usando as

propriedades declaradas na classe, atribuídas aos valores do formulário.

Abra agora o formulário Pesquisa Paciente, vá ao método Pesquisar e insira o seguinte

código:

Page 62: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Perceba que nesse método pouca coisa mudou. A diferença é que antes

meu DataTablerecebia um TableAdapter, que chamava os métodos de Pesquisa. Agora

não, quem faz isso é minha classe de Acesso a Dados.

Salve tudo e compile, vamos testar o projeto. Clique em Pacientes, Novo, digite um nome e

um telefone e clique em Salvar. Se o seu projeto está igual o meu, então houve um erro!

Page 63: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Este erro aponta que meu lblCodigo está vazio ou em um formato incorreto. Porque ainda

não temos o código do Paciente. Para isso, devemos fazer a seguinte alteração (lembrando

que estamos no método Salvar, do formulário Paciente Herdado):

Faço uma simples verificação, se o status for Editando, preciso preencher o código do

Paciente. Se for inserção, não há essa necessidade. Agora compile, grave um novo registro,

clique em Localizar, teste a busca, deverá estar funcionando corretamente. Agora dê dois

cliques no resultado da busca, exclua o registro e perceba que o código não foi excluído.

Como não podemos simplesmente ir ao método Excluir e apagar o label manualmente (até

podemos, mais não é correto!), já que temos rótulos diferentes, temos que ir ao formulário

base, irmos ao método LimpaControles, dentro do foreach dos controles, fazermos um if

no controle do tipo Label, e excluirmos somente o lblCodigo, que é o nome de nosso label

(se o label de seu form tiver outro nome, altere-o no if). Para isso, vá ao formulário Base e

insira o seguinte código:

Assim utilizamos facilmente o conceito de Herança, já que não precisamos ir toda vez no

método Excluir, e sim apenas uma vez no método LimpaControles.

Finalizando, deixo um desafio a vocês. Para que implementem o Cadastro de Médicos,

usando esses conceitos de Herança Visual, abordados nos artigos anteriores, e

principalmente os conceitos de MVC. No final do próximo artigo, estarei disponibilizando o

código-fonte completo do Cadastro de Médicos.

Para quem se interessar, estou disponibilizando para download o que fizemos até esta parte

do artigo em nosso sistema. Para baixar, clique aqui.

Na próxima parte de nossa série de artigos, iremos criar a classe, os métodos e o formulário

de Cadastro de Consultas, com algumas diferenças em relação ao Cadastro de Pacientes e

alguns métodos a mais. Usaremos também LINQ em nossos métodos. Não perca!

Page 64: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Nesta parte iremos criar o Cadastro de Consultas, implementando os métodos da classe de

Acesso a Dados para que o mesmo funcione, com a inclusão de 2 novos métodos.

Acompanhem:

Como dito no fim do artigo anterior, no final deste, segue o Cadastro de Médicos incluso

no código-fonte, que será disponibilizado ao fim deste artigo, seguindo o padrão dos outros

cadastros.

Dito isto, vamos criar o Cadastro de Consultas. Ele será um pouco diferente dos outros

Cadastros, pois terá, na classe de Acesso a Dados 2 novos métodos, o que irá Pesquisar pelo

nome do Paciente e a Pesquisa pelo nome d Médico. Outra diferença é que usaremos, mais a

frente, LINQ, para fazermos estas pesquisas.

Primeira modificação a ser feita é em nosso DataSet, já que devemos implementar os tipos

de consultas que iremos fazer, pelo código da consulta, pelo nome do paciente e/ou pelo

nome do médico.

Abra seu DataSet (no meu caso, o nome é dsConsulta) e clique com o botão direito

noConsultaTableAdapter, e clique em Add Query, para criarmos os métodos da mesma

forma como fizemos anteriormente. Este 1º método será o de Pesquisa por ID da Consulta.

Como feito anteriormente, clique em Use SQL Statements e SELECT which returns

rows, clique em Next para aparecer esta tela:

Page 65: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Devemos alterar esta instrução SQL, já que queremos retornar o ID da Consulta, Nome do

Medico, Nome do Paciente, Data da Consulta e Hora Inicial. Iremos também fazer

um INNER JOIN (ligação entre duas ou mais tabelas) com as tabelas Medico e Paciente.

Para fins didáticos (e seguindo a videoaula) vamos usar o Query Builder. Clique nele e, na

tela que aparece, clique com o botão direito na parte branca ao lado da tabela Consulta e

clique emAdd Table, adicione as tabelas Medico e Paciente, selecione os seguintes

campos e execute a instrução:

Page 66: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Nossa instrução SQL ficará da seguinte forma:

Só que ainda não está pronta. Vamos usar dois filtros, para retornarmos as consultas

parametrizadas pelo ID e pesquisarmos as consultas apenas que estiverem ativas. Altere

sua instrução para que fique desta forma:

Page 67: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Clique em Next e na próxima tela, deixe selecionado a 1ª opção, Fill a DataTable, dê o

nome de PesquisaID para ele, clique em Next e em Finish. Deverá aparecer esta

mensagem:

Que apenas indica que a instrução SQL usada nos retorna dados diferentes das outras

consultas, sem problemas.

Nosso campo Ativo está com o valor nulo (NULL), se o deixarmos assim, nossa query recém

criada não irá funcionar. Abra o SQL Server e confirme:

Para que funcione, devemos alterar este valor do campo Ativo. No SQL Server, execute a

seguinte instrução:

Page 68: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Agora sim, nossa query irá funcionar, já que nosso campo Ativo está com o valor 1 (True).

Para testar, clique com o botão direito em cima da query e clique em Preview Data. Na

janela que surge, coloque o valor parametrizado de nossa consulta, que no caso é referente

ao campo IdConsulta e clique em Preview:

Nosso próximo método será pelo Nome do Paciente. Faça o mesmo procedimento que o

método anterior, só altere a instrução SQL para a de baixo:

Clique em Next, selecione apenas a 1ª opção, dê o nome de PesquisaNomePaciente e

clique em Finish. Faça o mesmo para o próximo método, alterando a instrução SQL para nos

retornar o nome do médico e dando o nome de PesquisaNomeMedico:

Page 69: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Assim nossa tabela Consulta terá 3 pesquisas diferentes:

Agora vamos a classe AcessoDados para criarmos a classe de AcessoDadosConsulta que,

assim como as outras, irá herdar de AcessoDados e terá os mesmos métodos da classe

base e mais os 2 métodos que implementamos a pouco:

Page 70: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Como você pode perceber, implementei os

métodos PesquisaNomePaciente ePesquisaNomeMedico, o resto são os métodos

sobrescritos de minha classe baseAcessoDados. Não implementei estes 2 últimos métodos

da classe base, pois os métodos da classe base são genéricos a todas as outras classes.

Estes últimos são específicos para esta classe.

Estou disponibilizando para download o que fizemos até esta parte do artigo. Para

baixar,clique aqui. Na próxima parte de nossa série de artigos iremos implementar os

métodos referentes aos criados na classe AcessoDadosConsulta. Não perca!

Nesta parte iremos criar os códigos referentes aos métodos criados anteriormente da classe

de Consulta. Após isso, criaremos também um novo formulário, que será o de Pesquisa

das Consultas. Acompanhem:

Abra o DataSet de Consulta, para que modifiquemos o método Fill,

doConsultaTableAdapter. Vamos alterá-lo para que sejam retornadas apenas as consultas

que estiverem ativas. Para isso, clique com o botão direito em cima do

método Fill doConsultaTableAdapter e clique em Configure. Altere a instrução SQL que

aparece para a seguinte:

Nessa mesma tela, clique no botão Advanced Options e, na tela que aparece, desmarque

as duas últimas opções, como mostra a imagem a seguir:

Page 71: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Desmarcando essas opções, não iremos ter vários parâmetros em nosso método, dessa

forma estaremos evitando o uso de concorrência. Dê OK, clique em Next, Next na próxima

tela também e Finish. Assim iremos retornar somente as consultas que estiverem ativas.

Agora vamos criar em nossa classe de Acesso a Dados o método Pesquisar, que será

responsável por realizar todas as pesquisas. Então crie o método, como mostra abaixo:

PS: A partir de agora irei colocar em meus artigos desta série (como já faço com artigos

deASP.NET e SQL Server) o código em si e não mais prints do código, apenas com o intuito

de não poluir com muitas imagens os artigos.

01 public DataTable Pesquisar()

02

03 {

04

05 try

06

07 {

08

09 //instancio o TableAdapter e o DataTable

10

11 ConsultaTableAdapter ta = new ConsultaTableAdapter();

12

Page 72: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

13 dsConsulta.ConsultaDataTable dt

= new dsConsulta.ConsultaDataTable();

14

15 //uso o método Fill do TableAdapter, passando como parâmetro o DataTable

16

17 ta.Fill(dt);

18

19 //retorno o DataTable preenchido

20

21 return dt;

22

23 }

24

25 catch (Exception ex)

26

27 {

28

29 throw new Exception(ex.Message.ToString());

30

31 }

32

Page 73: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

33 }

A implementação dos outros métodos é parecida com a das outras classes de Acesso a

Dados. Vamos criar as propriedades relativas aos campos do banco nesta classe como feito

anteriormente, mais desta vez faremos de uma forma otimizada. Ao invés de criarmos as

propriedades privadas e públicas, podemos criar a pública e já declarar direto o get e set,

poupando assim código. Veja:

01 public int nCodConsulta { get; set; }

02

03 public int nCodMedico { get; set; }

04

05 public int nCodPaciente { get; set; }

06

07 public DateTime dDtConsulta { get; set; }

08

09 public DateTime dHrInicio { get; set; }

10

11 public DateTime dHrFim { get; set; }

12

13 public string sObservacao { get; set; }

14

15 public bool bAtivo { get; set; }

Lembrando que esse recurso está disponível a partir da versão 2008 do Visual Studio.

Vamos implementar o código do método Salvar, bem parecido com o método das outras

classes:

Page 74: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

01 public override bool Salvar(bool bInsert)

02

03 {

04

05 try

06

07 {

08

09 //instancio o TableAdapter

10

11 ConsultaTableAdapter ta = new ConsultaTableAdapter();

12

13 //crio uma variável auxiliar, que será retornada preenchida no fim do método

14

15 bool bSalvar = false;

16

17 //verifico, se estiver inserindo, minha variável bSalvar recebe o método

Insert

18

19 //do TableAdapter, passando como parâmetro as propriedades criadas no começo

da classe

20

Page 75: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

21 if (bInsert)

22

23 {

24

25 bSalvar = (ta.Insert(nCodMedico, nCodPaciente, dDtConsulta,

26

27 dHrInicio, dHrFim, sObservacoes, true) > 0);

28

29 }

30

31 //senão, uso o método Update e passo a propriedade bAtivo como parâmetro do

método

32

33 else

34

35 {

36

37 bSalvar = (ta.Update(nCodMedico, nCodPaciente, dDtConsulta,

dHrInicio,

38

39 dHrFim, sObservacoes, bAtivo, nCodConsulta) > 0);

40

Page 76: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

41 }

42

43 return bSalvar;

44

45 }

46

47 catch (Exception ex)

48

49 {

50

51 throw new Exception(ex.Message.ToString());

52

53 }

54

55 }

Neste código, se o método for Insert, passo como parâmetro as propriedades criadas

anteriormente e o valor true, como padrão, ou seja, sempre que for gravar, irá gravar a

consulta com o status Ativo. Já no método Update, preciso passar a propriedade bAtivo, já

que posso ter a situação do usuário estar querendo alterar o status de Ativo para Inativo,

por isso devo passá-la.

O método Delete é bem simples, nem preciso usar a variável auxiliar. Veja:

01 public override bool Delete()

02

03 {

Page 77: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

04

05 try

06

07 {

08

09 //instancio o TableAdapter

10

11 ConsultaTableAdapter ta = new ConsultaTableAdapter();

12

13 //retorno o método Delete passando a propriedade nCodConsulta como parâmetro

14

15 return (ta.Delete(nCodConsulta) > 0);

16

17 }

18

19 catch (Exception ex)

20

21 {

22

23 throw new Exception(ex.Message.ToString());

Page 78: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

24

25 }

26

27 }

Os próximos dois métodos PesquisaID serão iguais aos métodos das classes anteriores.

Confira:

01 public override DataTable PesquisaID(int nCodGenerico)

02

03 {

04

05 try

06

07 {

08

09 //instancio o DataTable e o TableAdapter

10

11 dsConsulta.ConsultaDataTable dt

= new dsConsulta.ConsultaDataTable();

12

13 ConsultaTableAdapter ta = new ConsultaTableAdapter();

14

15 //uso o método PesquisaID, passando como parâmetro o dt e a variável

nCodGenerico

Page 79: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

16

17 ta.PesquisaID(dt, nCodGenerico);

18

19 //retorno o DataTable preenchido

20

21 return dt;

22

23 }

24

25 catch (Exception ex)

26

27 {

28

29 throw new Exception(ex.Message.ToString());

30

31 }

32

33 }

34

35 public override DataRow PesquisaID()

Page 80: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

36

37 {

38

39 try

40

41 {

42

43 //retorno apenas a primeira linha de minha consulta

44

45 return this.PesquisaID(nCodConsulta).Rows[0];

46

47 }

48

49 catch (Exception ex)

50

51 {

52

53 throw new Exception(ex.Message.ToString());

54

55 }

Page 81: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

56

57 }

Os métodos PesquisaNomePaciente e PesquisaNomeMedico serão também

praticamente iguais em sua estrutura, só mudara que usarei os caracteres coringas (%)

como filtro de pesquisa, ou seja, quando o usuário digitar por exemplo ton, será pesquisado

todos os nomes que contenham essas letras.

01 public DataTable PesquisaNomePaciente(string sDsNomePaciente)

02

03 {

04

05 try

06

07 {

08

09 //instancio o DataTable e o TableAdapter

10

11 dsConsulta.ConsultaDataTable dt

= new dsConsulta.ConsultaDataTable();

12

13 ConsultaTableAdapter ta = new ConsultaTableAdapter();

14

15 //uso o método PesquisaNomePaciente, passando como parâmetro o dt

16

Page 82: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

17 //e os caracteres coringas, concatenados com a variável sDsNomePaciente

18

19 ta.PesquisaNomePaciente(dt, "%" + sDsNomePaciente + "%");

20

21 //retorno o DataTable preenchido

22

23 return dt;

24

25 }

26

27 catch (Exception ex)

28

29 {

30

31 throw new Exception(ex.Message.ToString());

32

33 }

34

35 }

36

Page 83: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

37 public DataTable PesquisaNomeMedico(string sDsNomeMedico)

38

39 {

40

41 try

42

43 {

44

45 //instancio o DataTable e o TableAdapter

46

47 dsConsulta.ConsultaDataTable dt

= new dsConsulta.ConsultaDataTable();

48

49 ConsultaTableAdapter ta = new ConsultaTableAdapter();

50

51 //uso o método PesquisaNomePaciente, passando como parâmetro o dt

52

53 //e os caracteres coringas, concatenados com a variável sDsNomeMedico

54

55 ta.PesquisaNomeMedico(dt, "%" + sDsNomeMedico + "%");

56

Page 84: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

57 //retorno o DataTable preenchido

58

59 return dt;

60

61 }

62

63 catch (Exception ex)

64

65 {

66

67 throw new Exception(ex.Message.ToString());

68

69 }

70

71 }

Pronto, nossa classe está implementada. Agora vamos criar nosso formulário

de Pesquisaque, diferente dos outros, terá três tipos de pesquisas: pelo Código,

pelo Nome do Médico e pelo Nome do Paciente.

Então, clique em Add > Windows Forms, na Solution Explorer, selecione o

templateInheritedForm, dê o nome de frmPesquisa a ele e clique em OK. Na tela que

surge perguntando de qual form você irá herdar, escolha o frmBase.

Como já disse, esse formulário terá três tipos de pesquisas, só que como ele é herdado do

formulário base, nos trouxe apenas os dois padrões, por Código e Descrição.

Precisamos então ir ao frmBase e alterar o modificador de acesso de alguns controles

parapublic (repare no frmPesquisa que estão como private com um cadeado, não é

possível movê-los ou redimensioná-los). Então, vá ao frmBase, altere a

propriedade Modifiers doGroupBox, GridView e dos dois Buttons.

Após fazer isso, dê um Build Solution (F6). Agora vá ao frmPesquisa, adicione

umRadioButton com o text Nome do Médico para que fique dessa forma:

Page 85: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Em nosso form precisamos sobrescrever o método Pesquisar, criado no formulário base.

Para isso, faça o seguinte:

01 public override void Pesquisar()

02

03 {

04

05 try

06

07 {

08

Page 86: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

09 //instancio a Classe e o DataTable

10

11 AcessoDadosConsulta acesso = new AcessoDadosConsulta();

12

13 DataTable dt = new DataTable();

14

15 //verifico qual RadioButton está checado, dependendo de qual for, chamo o

método adequado

16

17 if (rbtCodigo.Checked)

18

19 {

20

21 dt = acesso.PesquisaID(int.Parse(txtPesquisa.Text));

22

23 }

24

25 else if (rbtDescricao.Checked)

26

27 {

28

Page 87: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

29 dt = acesso.PesquisaNomePaciente("%" + txtPesquisa.Text + "%");

30

31 }

32

33 else if (rbtNomeMedico.Checked)

34

35 {

36

37 dt = acesso.PesquisaNomeMedico("%" + txtPesquisa.Text + "%");

38

39 }

40

41 //crio um novo método para carregar os itens no ListView

42

43 Carregar(dt);

44

45 }

46

47 catch (Exception ex)

48

Page 88: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

49 {

50

51 throw new Exception(ex.Message.ToString());

52

53 }

54

55 }

Como você pode ver acima, a diferença desse método com o do

form frmPesquisaPaciente, por exemplo, é que não iremos usar o método CarregarItens,

já que o mesmo usa apenas as 2 colunas do ListView e no nosso form usaremos mais do

que isso. Então vamos criar o método que foi chamado acima (que terá como diferença o

número de colunas apenas):

01 private void Carregar(DataTable dt)

02

03 {

04

05 try

06

07 {

08

09 //limpo os registros do ListView

10

11 lstPesquisa.Items.Clear();

Page 89: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

12

13 //carrego os dados no ListView

14

15 foreach (DataRow dr in dt.Rows)

16

17 {

18

19 //para cada linha de meu DataTable, insiro uma linha no ListView

20

21 //instancio o ListViewItem, adiciono os itens e subitens, referentes

22

23 //aos campos que estou pesquisando em meu ListView

24

25 ListViewItem item = new ListViewItem();

26

27 item.Text = dr["IDCONSULTA"].ToString();

28

29 item.SubItems.Add(dr["NOMEPACIENTE"].ToString());

30

31 item.SubItems.Add(dr["NOMEMEDICO"].ToString());

Page 90: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

32

33 item.SubItems.Add(dr["DATACONSULTA"].ToString());

34

35 item.SubItems.Add(dr["HORAINICIO"].ToString());

36

37 //aqui adiciono a varíavel instanciada item

38

39 //carregada com o item e subitem ao ListView

40

41 lstPesquisa.Items.Add(item);

42

43 }

44

45 }

46

47 catch (Exception ex)

48

49 {

50

51 throw new Exception(ex.Message.ToString());

Page 91: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

52

53 }

54

55 }

Ok, agora temos que adicionar estas colunas a mais em nosso ListView. Antes disso,

precisamos alterar o modificador de acesso das colunas que já existem para public. Então vá

ao frmPesquisaBase e abra na SmartTag do ListView a opção Edit Columns.

Nela, altere a propriedade das colunas para public, como mostra a imagem:

Dê OK, um Build Solution para atualizar o projeto e volte ao frmPesquisa.

Nele adicione três colunas, para que o ListView fique como na imagem a seguir:

Page 92: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Vamos testar o form. Antes de rodá-lo, abra o Form1.cs (o form principal) e altere o botão

que chama as Consultas:

01 private void toolStripButton3_Click(object sender, EventArgs e)

02

03 {

04

05 //frmConsulta consulta = new frmConsulta();

06

07 //consulta.ShowDialog();

08

09 frmPesquisa pesquisa = new frmPesquisa();

10

11 pesquisa.ShowDialog();

12

13 }

Page 93: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Salve e compile o projeto. Clique no botão Consultas para ver o resultado:

Estou disponibilizando para download o que fizemos até esta parte do artigo. Dei uma

revisada em todo o projeto, adicionando tratamento de erros nos métodos relevantes e

assim deixando o código mais limpo. Para baixar o projeto, clique aqui.

Nesta parte iremos fazer algumas alterações em nosso DataSet para que nosso formulário

de Pesquisas, criado anteriormente funcione corretamente e começar a criação

do Cadastro de Consultas implementando os métodos necessários para que o mesmo

funcione. Acompanhem:

Como dito anteriormente, antes de criarmos o Cadastro de Consultas, devemos realizar

algumas alterações em nosso DataSet para que nosso formulário de Pesquisas criado na

parte anterior funcione.

Se ao executarmos o formulário de Pesquisas e tentarmos realizar uma pesquisa, será

disparado o seguinte erro:

Page 94: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Este erro acontece porque em nossos métodos de Pesquisa

do TableAdapter de Consulta do nosso DataSet estamos retornando mais campos do que

temos em nosso TableAdapter:

Como você pode perceber pela imagem acima, estamos tentando retornar o Nome do

Médicoe o Nome do Paciente que estão em outras tabelas, por isso está dando este erro

de constraint. Se deixarmos assim, podem dar outros erros, como na hora da inserção de um

novo registro neste TableAdapter, já que os valores Nome do Médico e Nome do

Pacientenão pertencem a este TableAdapter.

Para resolvermos isso, vamos criar um TableAdapter exclusivo para as Pesquisas.

Clique com o botão direito em cima do método PesquisaID,

do TableAdapter de Consultas e clique em Configure. Copie a query que aparece, pois

vamos usá-la no TableAdapter que iremos criar.

Crie o TableAdapter usando a mesma string de conexão que os outros. Cole a query que

você copiou, clique em Advanced Options e desmarque as três opções, já que nossa query

será apenas para consulta:

Na próxima tela desmarque a opção Return a DataTable e na opção Fill a DataTable dê o

nome de PesquisaID, clique em Next e Finish. Irá aparecer os campos de consulta em

nossoTableAdapter.

Faça o mesmo com os

métodos PesquisaNomeMedico e PesquisaNomePaciente doTableAdapter de Consulta

s, ou seja, copie a query deles, crie métodos em nosso novoTableAdapter e cole essas

query’s. O resultado final de nosso TableAdapter será este:

Page 95: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Apenas clique com o botão direito em cima da coluna IDCONSULTA e clique em Delete

Keypara excluirmos a chave primária, já que, como já dissemos, usaremos

este TableAdapterapenas para pesquisas.

Podemos concluir que, para cadastros o uso do TableAdapter é excelente (neste tipo de

exemplo simples), já para consultas devemos analisar bem a situação. Se fizermos uma

consulta que contenha mais colunas que o nosso TableAdapter (como nesse exemplo),

devemos criar outro TableAdapter, específico para isso.

Exclua os métodos que copiamos, do TableAdapter de Consultas e dê um Build

Solution (F6) em sua aplicação, teremos alguns erros na classe de Acesso a Dados, pois

devemos alterar nosso DataTable e o TableAdapter, de Consultas para Pesquisas.

Voltando ao DataSet, vamos adicionar uma nova query no TableAdapter Consultas, que

nos retornará todas as pesquisas. A diferença é que esta query irá nos retornar as consultas

que estiverem ativas, ou seja, com o status Ativo = 1.

Agora volte a classe de Acesso a Dados e altere o método Pesquisar para o seguinte:

01 public DataTable Pesquisar()

Page 96: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

02

03 {

04

05 try

06

07 {

08

09 //instancio o TableAdapter e o DataTable

10

11 dsConsulta.PesquisasDataTable dt

= new dsConsulta.PesquisasDataTable();

12

13 PesquisasTableAdapter ta = new PesquisasTableAdapter();

14

15 //uso o método Fill do TableAdapter, passando como parâmetro o DataTable

16

17 ta.Pesquisar(dt);

18

19 //retorno o DataTable preenchido

20

21 return dt;

Page 97: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

22

23 }

24

25 catch (Exception ex)

26

27 {

28

29 throw new Exception(ex.Message.ToString());

30

31 }

32

33 }

Somente trocamos o DataTable e TableAdapter, como feito nos outros métodos, e

chamamos o método Pesquisar, que acabamos de criar. Compile a aplicação, clique

emConsultas, teste o formulário e você verá que agora está funcionando corretamente:

Page 98: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Para deixarmos 100% nosso formulário, vamos formatar nossos campos

de Data e Horausando um recurso importante de formatação do .NET, que é

o string.Format (mais sobre manipulação de strings em C# aqui).

Vá ao frmPesquisa.cs e, no método Carregar, use o string.Format para que o

campoDATACONSULTA exiba somente a data no formato dd/MM/yyyy e o

campo HORAINICIOexiba a hora no formato HH:mm, como o código abaixo nos mostra:

1 item.SubItems.Add(string.Format("{0:dd/MM/yyyy}",

dr["DATACONSULTA"]));

2

3 item.SubItems.Add(string.Format("{0:HH:mm}", dr["HORAINICIO"]));

Perceba que tirei o ToString() do final dos campos, já que o string.Format espera um

objeto (onde está meu dr[“DATACONSULTA”] por exemplo) e se eu passar

o ToString() ele reconhece como um simples texto e não aplica a formatação correta no

campo.

Salve e compile para ver o resultado:

Page 99: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Pronto, formulário finalizado. Agora sim vamos criar o Cadastro de Consultas.

Podemos perceber em nosso TableAdapter de Pesquisas que temos o Nome do Medico e

oNome do Paciente, ou seja, nossa tabela de Consultas tem chaves estrangeiras,

referente as tabelas Medico e Paciente. Em nosso form não podemos colocar textboxes

para o usuário digitar o nome do Médico e do Paciente, muito menos os respectivos ID’s

deles, já que, não temos a garantia de que o usuário irá digitar o nome ou ID correto.

Dessa forma como podemos ter a certeza que o cadastro de uma consulta será vinculada a

um Médico e a um Paciente? Por meio de consultas auxiliares, ou seja, a partir de nosso

form de Cadastro de Consultas o usuário irá escolher o nome ou código do Médico e fará

o mesmo com o Paciente. Assim iremos reaproveitar as telas de Pesquisa que já temos,

eliminando o trabalho de criar duas telas novas com novos controles e tudo mais.

Com essa idéia em mente, vamos criar um novo form. Vá na Solution Explorer (CTRL + W

+ S), clique com o botão direito na solução e clique em Add > New Item. Escolha a

categoria Windows Form, o template Inherited Form (que indica que nosso form será

herdado de outro) e dê o nome a ele de frmConsultaHerdado. Na tela que aparece para

selecionar o formulário que herdaremos, escolha o frmBase e clique em OK.

Adicione alguns labels, textboxes e buttons, para que seu form fique como o da imagem a

seguir:

Page 100: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Os ID’s e propriedades dos controles são:

Labels – lblNomePaciente, lblNomeMedico, lblDtConsulta, lblHrInicio, lblHrFim e

lblObservacoes.

Textboxes – txtNomePaciente, txtNomeMedico, estes dois com a propriedade ReadOnly =

True (que indica que nossos textboxes serão somente leitura) e com texto em negrito, e

txtObservacoes, este último com a propriedade Multiline para True.

Datetimepicker – dtConsulta, dtHrInicio e dtHrFim. Altere também a propriedade Custom

Format do dtConsulta para dd/MM/yyyy e altere a propriedade Format para Custom. Faça

o mesmo com os outros datetimepicker, colocando no Custom Format o valor HH:mm.

Buttons – btnConsultarPaciente e btnConsultarMedico. Por enquanto deixaremos com este

texto btn, depois alteraremos para uma imagem para demonstrar ao usuário que esses

botões servirão para pesquisar os pacientes e médicos.

No formulário base temos uma variável pública, que é visível em todo o formulário que herda

deste form, responsável por armazenar um código genérico. Assim, em nossos cadastros

dePaciente e de Médico quando fazemos a gravação dos dados usamos esta variável para

receber o ID da gravação. Em nosso cadastro de consulta, temos que fazer o mesmo, criar

duas variáveis que serão responsáveis por armazenar os códigos de Paciente e de Médico.

Ela será preenchida no momento em que clicarmos nos botões que criamos, pesquisarmos

pelo Paciente e/ou Médico, o selecionarmos na pesquisa, clicarmos em OK e voltarmos ao

nosso form. Nesse momento nossas variáveis receberão os códigos respectivos de cada

formulário.

Por enquanto vá à página de códigos de nosso form e declare as variáveis responsáveis por

receber estes códigos:

1 public int _nCodPaciente;

2

3 public int _nCodMedico;

Agora volte ao formulário e dê dois cliques nos botões para chamar o evento Click dos

mesmos. Neles, faça o seguinte código para chamar os formulários responsáveis por

pesquisar Paciente e Médico, respectivamente:

Page 101: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

01 private void btnConsultarPaciente_Click(object sender, EventArgs e)

02

03 {

04

05 frmPesquisaPaciente frmPesquisaPaciente

= new frmPesquisaPaciente();

06

07 if (frmPesquisaPaciente.ShowDialog() == DialogResult.OK)

08

09 {

10

11 if (frmPesquisaPaciente.sCdCodigo != string.Empty)

12

13 {

14

15 _nCodPaciente = int.Parse(frmPesquisaPaciente.sCdCodigo);

16

17 }

18

19 }

20

Page 102: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

21 }

22

23 private void btnConsultarMedico_Click(object sender, EventArgs e)

24

25 {

26

27 frmPesquisaMedico frmPesquisaMedico = new frmPesquisaMedico();

28

29 if (frmPesquisaMedico.ShowDialog() == DialogResult.OK)

30

31 {

32

33 if (frmPesquisaMedico.sCdCodigo != string.Empty)

34

35 {

36

37 _nCodMedico = int.Parse(frmPesquisaMedico.sCdCodigo);

38

39 }

40

Page 103: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

41 }

42

43 }

Percebam que estes códigos são iguais aos do botão Localizar dos forms de cadastro de

Paciente e Médico. Assim nossas variáveis serão preenchidas com os códigos vindos do

registro pesquisado pelo usuário nos forms.

Dessa forma estamos reaproveitando código e melhorando o desempenho de nossa

aplicação, pois não precisamos criar novas telas para fazer isso.

Vamos testar nosso form agora. Vá ao formulário principal de Consultas, dê dois cliques no

botão Consultas e altere o código do mesmo para o de baixo:

1 private void toolStripButton3_Click(object sender, EventArgs e)

2

3 {

4

5 frmConsultaHerdado frmConsulta = new frmConsultaHerdado();

6

7 frmConsulta.ShowDialog();

8

9 }

Salve e compile. Clique no botão Consultas para que nosso form se abra. Agora clique em

Novo e clique em um dos botões que criamos para ver que será aberto o form de Pesquisa.

Selecione um registro e clique em OK, voltaremos ao nosso form, mais nosso textbox não

será preenchido com o registro selecionado, pois falta implementarmos o método que

pesquisará o Médico e o Paciente. Seguindo essa linha de reaproveitamento de código,

usaremos os métodos já criados em nossa classe de Acesso a Dados.

Estou disponibilizando para download o que fizemos até esta parte. Para baixar, clique aqui.

Nesta parte iremos continuar as alterações em nosso Cadastro de Consultas, feitas

na parte 12, realizando alterações no formulário e criando os

métodos Salvar, Excluir, Localizar eCarrega Valores. Acompanhem:

Page 104: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Voltando ao nosso frmConsultaHerdado, temos em nossos botões já implementados a

consulta de Médico e Paciente. Vamos adicionar uma imagem a eles.

Para isso, abra a ToolBox, arraste o controle ImageList para o formulário e clique na

opçãoChoose images, como você pode ver abaixo:

A imagem escolhida estará disponível para download ao final do artigo, juntamente com o

projeto. Clique em Add, escolha a imagem, clique em Abrir e dê OK. Altere a

propriedadeTransparentColor, do ImageList, para Magenta, a fim de deixar a imagem

transparente.

Agora vá nas propriedades dos botões do form, limpe a propriedade Text, selecione na

propriedade ImageList o controle que arrastamos pro form, e na

propriedade ImageKeyselecione a imagem que adicionamos ao ImageList, como a imagem

abaixo ilustra:

No artigo anterior, não estávamos retornando o nome do Paciente nem do Médico em

nosso formulário, apenas armazenamos os ID’s deles nas variáveis _nCodPaciente e

_nCodMedico. Para resolvermos isso, podemos fazer de dois modos, iremos ver ambos a

seguir:

Modo 1 – Aqui iremos criar um método nas

classes AcessoDadosPaciente eAcessoDadosMedico, dentro da classe pai de Acesso a

Dados, que irá fazer duas consultas no banco, uma que irá retornar o nome do Paciente e

outra que retornará o nome doMédico. Para isso, vá às respectivas classes e faça o seguinte

método:

01 public string PesquisaNome(int nCodGenerico)

02

Page 105: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

03 {

04

05 //Crio um DataTable, que recebe meu método PesquisaID

06

07 DataTable dt = PesquisaID(nCodGenerico);

08

09 //Verifico se meu DataTable contém linhas, se tiver retorno o método

PesquisaID,

10

11 //Exibindo a primeira linha e a coluna com o nome do Paciente, convertido para

string.

12

13 //Se não tiver linhas retorno uma string vazia.

14

15 if (dt.Rows.Count > 0)

16

17 {

18

19 return PesquisaID(nCodGenerico).Rows[0]["NOMEPACIENTE"].ToString();

20

21 }

22

Page 106: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

23 else

24

25 {

26

27 return string.Empty;

28

29 }

30

31 }

Seguindo esta lógica, crie o mesmo método para a classe AcessoDadosMedico.

Agora volte ao frmConsultaHerdado, vá ao método referente aos eventos click dos botões

de Paciente e Médico (coloquei os códigos dentro de métodos para facilitar o tratamento de

erros e só fiz a chamada ao método nos botões) e altere a codificação deles para a seguinte:

01 private void ConsultarPaciente()

02

03 {

04

05 AcessoDadosPaciente objPaciente = new AcessoDadosPaciente();

06

07 frmPesquisaPaciente frmPesquisaPaciente

= new frmPesquisaPaciente();

08

09 try

Page 107: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

10

11 {

12

13 if (frmPesquisaPaciente.ShowDialog() == DialogResult.OK)

14

15 {

16

17 if (frmPesquisaPaciente.sCdCodigo != string.Empty)

18

19 {

20

21 _nCodPaciente = int.Parse(frmPesquisaPaciente.sCdCodigo);

22

23 //Meu txtNomePaciente recebe o objPaciente chamando o método PesquisaNome,

24

25 //passando como parâmetro a variável _nCodPaciente

26

27 txtNomePaciente.Text = objPaciente.PesquisaNome(_nCodPaciente);

28

29 }

Page 108: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

30

31 }

32

33 }

34

35 catch (Exception ex)

36

37 {

38

39 throw new Exception(ex.Message.ToString());

40

41 }

42

43 }

Perceba que agora estou usando o método da classe de Acesso a Dados, que implementei

anteriormente.

Seguindo esta lógica, faça o mesmo com o método ConsultarMedico.

Métodos implementados, aperte F5 para compilar o projeto, clique nesses botões para

consultar o Médico e o Paciente e veja que agora os campos texto são preenchidos:

Page 109: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Perceba que desta forma estamos fazendo consultas ao banco duas vezes, uma para

pesquisarmos o nome e, dentro dela, outra para retornarmos o nome

do Médico ou Paciente. Veja da outra forma como isso é diferente:

Modo 2 – Aqui, ao invés de fazer duas consultas ao banco, iremos trabalhar com a

“passagem” de variáveis entre formulários.

Usaremos o frmPesquisaBase, que já contém uma variável auxiliar (com o

nome sCdCodigo) que recebe o código da consulta quando pesquisado por

um Médico ou Paciente.

Se você notar a codificação dos métodos para Consultar Médico e Consultar

Pacienteperceberá que está variável já é usada em nosso formulário para consultarmos

o ID do usuário pesquisado:

1 _nCodPaciente = int.Parse(frmPesquisaPaciente.sCdCodigo);

Então, só precisamos criar outra variável no frmPesquisaBase que irá receber o nome do

usuário pesquisado. Lembrando que este exemplo serve para este caso, em que temos

apenas duas colunas em nosso ListView.

Dito tudo isto, abra o frmPesquisaBase e declare uma variável do tipo string que receberá

o nome pesquisado em nossa consulta (perceba que ela é declarada logo abaixo da

variávelsCdCodigo):

1 //Declaramos as variáveis públicas do tipo string

2

3 public string sCdCodigo;

4

5 public string sDsNome;

Aproveite também para inicializar esta variável com o valor vazio, no construtor da classe:

Page 110: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

01 public frmPesquisaBase()

02

03 {

04

05 InitializeComponent();

06

07 //Inicializamos as variáveis com valor vazio

08

09 sCdCodigo = string.Empty;

10

11 sDsNome = string.Empty;

12

13 }

Dentro do evento Click do botão OK, altere o código para o seguinte:

01 //faço a verificação se a variável sCdCodigo está vazia

02

03 if (sCdCodigo == string.Empty)

04

05 {

06

07 //se estiver vazia e o foco estiver no ListView preencho as variáveis

Page 111: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

08

09 if (lstPesquisa.Focused)

10

11 {

12

13 sCdCodigo = lstPesquisa.SelectedItems[0].Text;

14

15 sDsNome = lstPesquisa.SelectedItems[0].SubItems[1].Text;

16

17 }

18

19 }

Perceba no código acima que estou passando a variável recém-criada para ser preenchida

pelo ListView. Insira esta linha também no evento DoubleClick e também nos

eventosKeyDown e SelectedIndexChanged, do ListView.

Assim nossa variável sDsNome será preenchida sempre que consultarmos um usuário neste

formulário. E é ela que passaremos ao frmCadastroHerdado.

Volte novamente a este formulário e, no método ConsultarPaciente, altere-o para o

seguinte:

01 private void ConsultarPaciente()

02

03 {

04

05 frmPesquisaPaciente frmPesquisaPaciente

= new frmPesquisaPaciente();

Page 112: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

06

07 try

08

09 {

10

11 if (frmPesquisaPaciente.ShowDialog() == DialogResult.OK)

12

13 {

14

15 if (frmPesquisaPaciente.sCdCodigo != string.Empty)

16

17 {

18

19 _nCodPaciente = int.Parse(frmPesquisaPaciente.sCdCodigo);

20

21 txtNomePaciente.Text = frmPesquisaPaciente.sDsNome;

22

23 }

24

25 }

Page 113: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

26

27 }

28

29 catch (Exception ex)

30

31 {

32

33 throw new Exception(ex.Message.ToString());

34

35 }

36

37 }

Veja que assim, não precisaremos usar a classe de Acesso a Dados e, consequentemente,

não faremos duas consultas ao banco, ganhando assim em performance. Só fazer a mesma

alteração no método ConsultarMedico.

Aperte F5 e faça uma consulta para ver se está tudo OK:

Page 114: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

Vá à classe de Acesso a Dados, e na classe AcessoDadosConsulta, crie o seguinte

construtor:

1 public AcessoDadosConsulta(int nCodConsulta)

2

3 {

4

5 this.nCodConsulta = nCodConsulta;

6

7 }

Com este construtor criado não teremos problemas ao retornar registros de consultas em

nosso formulário, quando criarmos o método CarregaValores.

Seguindo as videoaulas que originaram este artigo, vamos agora criar os

métodos Salvar,Excluir, Localizar e Carrega Valores, bem parecidos com os métodos de

outros formulários. Veja a codificação de cada um a seguir:

Salvar –

01 public override bool Salvar()

02

03 {

Page 115: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

04

05 try

06

07 {

08

09 bool bSalvar = false;

10

11 //Instancio a classe de Acesso a Dados

12

13 AcessoDadosConsulta objConsulta

= new AcessoDadosConsulta(_nCodGenerico);

14

15 //Se estiver editando, minha variável nCodConsulta, da classe de Acesso a

Dados recebe o _nCodGenerico

16

17 if (sStatus == StatusCadastro.scEditando)

18

19 {

20

21 objConsulta.nCodConsulta = _nCodGenerico;

22

Page 116: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

23 }

24

25 //Preencho os valores do form

26

27 objConsulta.nCodMedico = _nCodMedico;

28

29 objConsulta.nCodPaciente = _nCodPaciente;

30

31 objConsulta.dDtConsulta = dtConsulta.Value;

32

33 objConsulta.dHrInicio =

DateTime.Parse(dtHrInicio.Value.ToShortTimeString());

34

35 objConsulta.dHrFim =

DateTime.Parse(dtHrFim.Value.ToShortTimeString());

36

37 objConsulta.sObservacoes = txtObservacoes.Text;

38

39 bSalvar = (objConsulta.Salvar(sStatus ==

StatusCadastro.scInserindo));

40

41 return bSalvar;

Page 117: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

42

43 }

44

45 catch (Exception ex)

46

47 {

48

49 throw new Exception(ex.Message.ToString());

50

51 }

52

53 }

Excluir –

01 public override bool Excluir()

02

03 {

04

05 try

06

07 {

08

Page 118: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

09 AcessoDadosConsulta objConsulta = new AcessoDadosConsulta();

10

11 return objConsulta.Delete();

12

13 }

14

15 catch (Exception ex)

16

17 {

18

19 throw new Exception(ex.Message.ToString());

20

21 }

22

23 }

Localizar –

01 public override bool Localizar()

02

03 {

04

05 try

Page 119: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

06

07 {

08

09 bool bLocalizar = false;

10

11 frmPesquisa frmPesquisa = new frmPesquisa();

12

13 //faço abaixo uma verificação, se o usuário clicar em OK

14

15 //minha variável bLocalizar recebe o sCdCodigo

16

17 if (frmPesquisa.ShowDialog() == DialogResult.OK)

18

19 {

20

21 bLocalizar = (frmPesquisa.sCdCodigo != string.Empty);

22

23 //verifico agora se meu bLocalizar retornou algum registro

24

25 if (bLocalizar)

Page 120: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

26

27 {

28

29 _nCodGenerico = int.Parse(frmPesquisa.sCdCodigo);

30

31 }

32

33 }

34

35 return bLocalizar;

36

37 }

38

39 catch (Exception ex)

40

41 {

42

43 throw new Exception(ex.Message.ToString());

44

45 }

Page 121: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

46

47 }

Carrega Valores –

01 public override void CarregaValores()

02

03 {

04

05 try

06

07 {

08

09 //Instancio a classe e o DataRow, que recebe o método PesquisaID de minha

classe

10

11 AcessoDadosConsulta objConsulta

= new AcessoDadosConsulta(_nCodGenerico);

12

13 DataRow dr = objConsulta.PesquisaID();

14

15 //Se o DataRow for diferente de nulo, preencho as propriedades

16

17 if (dr != null)

Page 122: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

18

19 {

20

21 dtConsulta.Value = DateTime.Parse(dr["DATACONSULTA"].ToString());

22

23 dtHrInicio.Value = DateTime.Parse(dr["HORAINICIO"].ToString());

24

25 dtHrFim.Value = DateTime.Parse(dr["HORAFIM"].ToString());

26

27 txtObservacoes.Text = dr["OBSERVACOES"].ToString();

28

29 }

30

31 }

32

33 catch (Exception ex)

34

35 {

36

37 throw new Exception(ex.Message.ToString());

Page 123: Tutorial C# (Cadastro Cliente) - Artigo redigido por Wellington Balbo de Camargo

38

39 }

40

41 }

Se apertarmos F5 e para compilar teremos um erro no frmPesquisa, pois teremos que

alterar a chamada à classe AcessoDadosConsulta, já que agora ele “espera” um valor do

tipo intcomo parâmetro. Para resolver é só passar o valor 0 e compilar a aplicação sem

problemas.

Agora nos surge um problema. Se clicarmos no botão Localizar do frmCadastroHerdado,

o mesmo não irá carregar o nome do médico e o nome do paciente em nossa tela. Para

resolvermos isso teremos que alterar nosso DataSet, incluindo assim novos campos para

que, ao clicarmos no botão Localizar, ele nos retorne os nomes do médico e do paciente.

É isso que faremos na próxima parte do nosso Consultório, alterando não só o DataSet,

como também os métodos criados acima. Não perca!

Disponibilizo o código-fonte do projeto clicando aqui.