Cadastro de um Consultório em Windows Forms, com C# e SQL Server – Parte 7

Olá pessoal, continuamos nossa série de artigos criando aplicações simples em Windows Forms usando a linguagem C# e o banco de dados SQL Server.

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.

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:

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 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:

Agora precisamos sobrescrever os métodos que, no formulário base, foram declarados como virtual, como o Salvar, Excluir, Localizar e Carregar Valores. Para isso, aperte F7 no frmBase 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:

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:

Agora clique em Advanced Options e desmarque as opções Use optimistic concurrency e Refresh 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.

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:

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 em Add > 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 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, a nCodGenerico 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.

Na próxima parte de nossa série de artigos, iremos criar o método Pesquisar, do formulário de Pesquisa, para que assim nosso Cadastro de Paciente esteja completo. Tudo isso usando herança visual. Iremos também começar a fazer uma simulação do padrão MVC (Model View Controller) em nosso sistema. Não perca!

Créditos à Luciano Pimenta, que fez as videoaulas e ao Portal Linha de Código, por onde pude baixá-las (mediante assinatura), estudá-las e posteriormente fazer este artigo.

Quaisquer dúvidas, mandem emails para wellingtonbalbo@gmail.com ou deixem nos comentários deste artigo que responderei o mais breve possível.

Até o próximo artigo!

46 comentários em “Cadastro de um Consultório em Windows Forms, com C# e SQL Server – Parte 7

  1. Vou te encaminhar um email com uns print’s da tela.

    É o seguinte quando eu configuro minha consulta no TableAdapter Query Configuration Wizard, coloco Inner Join, para pegar os dados da outra tabela entende..! No entanto ao executar o programa, e fazer a consulta, ele retorna um erro.

    Resumindo, gostaria que se possível, desse um exemplo de consulta com DataSet/TableAdapter com relacionamento de tabelas.

    Curtir

  2. Olá gostaria de saber como faço o DataSet/TableAdapter com a TabelaConsulta, vejo que a tabela está relacionada, e quando tento fazer a Consulta, ele me retorna um erro. Gostaria que se possível me ajudasse com a tela de Consulta da Tabela Consulta, retornando o Nome do Médico e Nome do Paciente. Obrigado

    Curtir

  3. consegui mas surgiu um novo erro , lembra que a gente pôs os comandos

    btnNovo.Enabled = (sStatus == StatusCadastro.scNavegando);

    ta dando erro em todos

    Error 3 The name ‘btnExcluir’ does not exist in the current context

    Curtir

  4. Fala cara, parabens pela sua iniciativa, segui todos os passos e está fufando graças a Deus, só tem uma coisa estranha acontecendo, o valor do código do cliente nunca é substituído fica sempre como label, será que é algo que esqueci de fazer.
    Abraços

    Curtir

      1. Acontece assim, no método insert eu sou obrigado a passar o campo código diferente do que aparece no seu exemplo, e como no botão novo não existe nada que atualize o código, fica sempre um valor em branco, existe alguma possibilidade de no momento que clico em novo, um código ser atribuído ao lblcódigo ? Pois ele sempre fica em branco.

        Curtir

        1. Alex, o código em seu banco não é gerado automaticamente? campo Auto-incremento? Você pode gerar um código ou abrir um textbox pro usuário digitar mais acho ideal deixar a coluna como chave primária e auto-incremento.

          Abraços.

          Curtir

  5. Segui todos os passos inclusive os que vc ensinou para resolver os erros…. mas conituna dando dois erros:

    Error 1 No overload for method ‘Insert’ takes 2 arguments

    e

    Error 2 No overload for method ‘Update’ takes 3 arguments

    Ambos dentro do método Salvar. o que faço?

    Curtir

    1. Então, esses erros indicam que os métodos pedem parâmetros e não foram passados os mesmos pra eles.

      Você precisa ver lá no DataSet se esses métodos existem e, se existem, tentar descobrir porque não está sendo passados os parâmetros que o erro indicou.

      Se não conseguir resolver envia seu projeto pro meu email que tento te ajudar.

      Abraços.

      Curtir

      1. Obrigada pela atenção. Não se te disse lá no email ou no facebook (estava desesperada), mas eu estava fazendo o sistema como atividade de estágio. E o prazo máximo era ontem… infelizmente a partir de hj não terei mais tempo para continuar.
        Amanhã voltam as aulas e com elas o início do tão temido TCC, então a dedicação tem que ser total à ele.

        Mesmo assim mto obrigada pela atençao e parabéns pelo blog!!
        O material realmente é mto explicativo e torna muito mais simples o desenvolvimento.
        resumindo: excelente!!

        obrigada msm!!

        abraço

        Curtir

  6. Desculpa incomodar mas um pouco cara, mas minha duvida é: quando adiciono o formulario herdado de FrmBase, nao consigo modificar nada nele todas as caracteristicas estao travadas. como faço?

    vlw atenção.

    Curtir

  7. bom dia welllington nao funcionou,

    dt = ta.PesquisarPorIdPaciente(ncodigo_generico); –> erro nessa linha implicit converter o
    tipo.

    nao aceita passar o parametro (ncodigo_generico) de acordo com seu material postado.

    se vc poder ajudar agradeço.

    abrçao

    Curtir

    1. Cara, se não aceita o parâmetro é porque não existe o método criado, dá uma olhada nisso aê.

      Baixa uma versão mais atual do Consultório, já está na parte 17.

      Abraços.

      Curtir

  8. DataSetConsulta.PacienteDataTable dt = new DataSetConsulta.PacienteDataTable();
    PacienteTableAdapter ta = new PacienteTableAdapter();
    dt = ta.PesquisarPorIdPaciente(ncodigo_generico);
    if (dt.Rows.Count>0)
    {
    lblcodigo.Text = dt.Rows[0][“Idpaciente”].ToString();
    txtNome.Text = dt.Rows[0][“nome”].ToString();
    txtTelefone.Text = dt.Rows[0][“Telefone”].ToString();
    }

    Error 1 Cannot implicitly convert type ‘object’ to ‘Consultorio.DataSetConsulta.PacienteDataTable’. An explicit conversion exists (are you missing a cast?)

    Olá welligton pode me ajudar com este erro.

    aguardo vlw.

    Curtir

    1. Alenisio, você não conseguirá atribuir a Label e Textbox o valor direto do DataTable.

      O que pode conseguir é jogar as linhas do DataTable em um DataRow e, a partir dele, atribuir os valores.

      Ficaria algo como:

      if (dt.Rows.Count>0)
      {
      DataRow dr = dt.Rows;
      lblcodigo.Text = dr[“Idpaciente”].ToString();
      txtNome.Text = dr[“nome”].ToString();
      txtTelefone.Text = dr[“Telefone”].ToString();
      }

      Testa ae.

      Abraços.

      Curtir

  9. txtCodCliente.Focus(); assim tambem nao funciona wellinton já tentei.

    Quando compilo, nessa mesma linha da esse erro=implicito converter boll para string

    se vc poder ajudar agradeço. Aparentemente parece ser um erro simples mas ainda num consegui reslover.

    Valeu!

    alenisio

    Curtir

  10. wellington, nao consigo mudar o table em sequencia nos textbox do meu form e tambem nao consigo colocar o focus no texbox Ex: txtcodCliente.text= Focus(): sendo que estao dentro de um groupbox.

    ERRO= implicito converter bool para string

    Abraço

    Curtir

  11. Parabens!!!!! Pelo seu trabalho. Sou estudante e estou desenvolvendo meu projeto de TCC em C# e comecei a acompanhar seu artigo fiquei bastante esclarecido sobre dataset, dataadapter e datatable. Precisamos de pessoas como voce.
    obrigado

    Curtir

  12. E ai, desculpe incomodar, mas consegui achar o erro aqui. Em relação ao PesquisaID no DataSet eu já tinha criado.

    Obrigado pela atenção.

    Abraço

    Curtir

  13. Cara, estou com um problema parecido com o do Thiago. Quando vou sobrecarregar o método Pesquisar da o erro

    No overload for method PesquisaID 1 takes arguments

    Curtir

  14. me desculpe pelo incomodo, consegui encontrar o erro, mas mesmo assim agradeço pelo site e pelas informações que voçe está compartilhando vlw.

    Curtir

  15. oi amigo estou com um problema quando vou sobrecarregar o método salvar acontece este erro

    Error 1 No overload for method ‘Insert’ takes 2 arguments

    poderia ma ajudar??

    Curtir

  16. Não sendo muito chato (mais???), tem como você mandar os arquivos do programa, os links dos downloads estão todos com problemas.

    Curtir

  17. Bom dia Wellington, estou com problemas novamente, esta vez é na hora de passar os dados do ListView para o outro formulário, eu faço as pesquisas normalmente, mas quando dou os dois cliques no paciente que estou procurando, ele fecha a pesquisa e vai pro Form do paciente sem carregar nada, ele habilita os campos com o nome e o telefone mas não carrega nada do ListView para o form de pacientes.

    Curtir

    1. Cara, você só conseguirá descobrir o que acontece usando Breakpoint nos seus formulários e entrando nos métodos para descobrir o que se passa “por trás” dos forms, direto no código.

      Abraços.

      Curtir

  18. Olá amigo boa noite, tipo gostaria de saber por que o meu quando gero o form da herança ele puxa o campo novo e o campo excluir em nulo ? Tipo não da para clicar neles, como faço para arrumar isso ?
    No frmBase tá normal todos ativado, mais quando puxa desativa o novo e o excluir.
    Qualquer coisa te mando print por email ok
    Obrigado

    Curtir

    1. Cara, desculpa se não deu pra responder, ando sem tempo pra nada!

      Manda o que acontece no seu form pra mim por email, se quiser mande o projeto zipado que eu vejo pra vc o que está acontecendo.

      Abraços.

      Curtir

  19. Cara d+, legal mesmo as dicas de Cadastro de um Consultório em Windows Forms, com C# e SQL Server, gostaria de ver os arquivos parte 2 até a parte 6. Abraços.

    Curtir

  20. Muito bom é desse tipo de artigos que precisamos, para aprender! Mas no meu projeto gerou um erro onde na herança visual dos forms…o frmBase não apareçe na lista?

    Curtir

Expresse sua opinião!

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s