Desenvolvimento - C#

Cadastro de um Consultório em Windows Forms - Parte 13

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 e Carrega Valores.

por Wellington Balbo de Camargo



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

 Olá pessoal, 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 e Carrega Valores. Acompanhem:

 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ção Choose 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 propriedade TransparentColor, 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 ImageKey selecione 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 e AcessoDadosMedico, 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 do Médico. Para isso, vá às respectivas classes e faça o seguinte método:

public string PesquisaNome(int nCodGenerico)

        {

            //Crio um DataTable, que recebe meu método PesquisaID           

            DataTable dt = PesquisaID(nCodGenerico);

            //Verifico se meu DataTable contém linhas, se tiver retorno o método PesquisaID,

            //Exibindo a primeira linha e a coluna com o nome do Paciente, convertido para string.

            //Se não tiver linhas retorno uma string vazia.

            if (dt.Rows.Count > 0)

            {

                return PesquisaID(nCodGenerico).Rows[0]["NOMEPACIENTE"].ToString();

            }

            else

            {

                return string.Empty;

            }

        }

 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:

private void ConsultarPaciente()

        {

            AcessoDadosPaciente objPaciente = new AcessoDadosPaciente();           

            frmPesquisaPaciente frmPesquisaPaciente = new frmPesquisaPaciente();

            try

            {  

                if (frmPesquisaPaciente.ShowDialog() == DialogResult.OK)

                {

                    if (frmPesquisaPaciente.sCdCodigo != string.Empty)

                    {

                        _nCodPaciente = int.Parse(frmPesquisaPaciente.sCdCodigo);

                        

                        //Meu txtNomePaciente recebe o objPaciente chamando o método PesquisaNome,

                        //passando como parâmetro a variável _nCodPaciente

                        txtNomePaciente.Text = objPaciente.PesquisaNome(_nCodPaciente);

                    }

                }

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message.ToString());

            }           

        }

 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:

 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 Paciente perceberá que está variável já é usada em nosso formulário para consultarmos o ID do usuário pesquisado:

_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ável sCdCodigo):

//Declaramos as variáveis públicas do tipo string

public string sCdCodigo;

public string sDsNome;

 Aproveite também para inicializar esta variável com o valor vazio, no construtor da classe:

public frmPesquisaBase()

        {

            InitializeComponent();

            //Inicializamos as variáveis com valor vazio

            sCdCodigo = string.Empty;

            sDsNome = string.Empty;

        }

 Dentro do evento Click do botão OK, altere o código para o seguinte:

//faço a verificação se a variável sCdCodigo está vazia

                if (sCdCodigo == string.Empty)

                {

                    //se estiver vazia e o foco estiver no ListView preencho as variáveis

                    if (lstPesquisa.Focused)

                    {

                        sCdCodigo = lstPesquisa.SelectedItems[0].Text;

                        sDsNome = lstPesquisa.SelectedItems[0].SubItems[1].Text;

                    }

                }

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

private void ConsultarPaciente()

        {

            frmPesquisaPaciente frmPesquisaPaciente = new frmPesquisaPaciente();

            try

            {  

                if (frmPesquisaPaciente.ShowDialog() == DialogResult.OK)

                {

                    if (frmPesquisaPaciente.sCdCodigo != string.Empty)

                    {

                        _nCodPaciente = int.Parse(frmPesquisaPaciente.sCdCodigo);

                        txtNomePaciente.Text = frmPesquisaPaciente.sDsNome;

                    }

                }

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message.ToString());

            }           

        }

 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:

 Vá à classe de Acesso a Dados, e na classe AcessoDadosConsulta, crie o seguinte construtor:

public AcessoDadosConsulta(int nCodConsulta)

        {

            this.nCodConsulta = nCodConsulta;

        }

 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 –

public override bool Salvar()

        {

            try

            {

                bool bSalvar = false;

                //Instancio a classe de Acesso a Dados

                AcessoDadosConsulta objConsulta = new AcessoDadosConsulta(_nCodGenerico);

                //Se estiver editando, minha variável nCodConsulta, da classe de Acesso a Dados recebe o _nCodGenerico

                if (sStatus == StatusCadastro.scEditando)

                {

                    objConsulta.nCodConsulta = _nCodGenerico;

                }

               

                //Preencho os valores do form

                objConsulta.nCodMedico = _nCodMedico;

                objConsulta.nCodPaciente = _nCodPaciente;

                objConsulta.dDtConsulta = dtConsulta.Value;

                objConsulta.dHrInicio = DateTime.Parse(dtHrInicio.Value.ToShortTimeString());

                objConsulta.dHrFim = DateTime.Parse(dtHrFim.Value.ToShortTimeString());

                objConsulta.sObservacoes = txtObservacoes.Text;

                bSalvar = (objConsulta.Salvar(sStatus == StatusCadastro.scInserindo));

                return bSalvar;

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message.ToString());

            }

        }

 Excluir –

public override bool Excluir()

        {

            try

            {

                AcessoDadosConsulta objConsulta = new AcessoDadosConsulta();

                return objConsulta.Delete();

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message.ToString());

            }

        }

 Localizar –

public override bool Localizar()

        {

            try

            {

                bool bLocalizar = false;

                frmPesquisa frmPesquisa = new frmPesquisa();

                //faço abaixo uma verificação, se o usuário clicar em OK

                //minha variável bLocalizar recebe o sCdCodigo

                if (frmPesquisa.ShowDialog() == DialogResult.OK)

                {

                    bLocalizar = (frmPesquisa.sCdCodigo != string.Empty);

                    //verifico agora se meu bLocalizar retornou algum registro

                    if (bLocalizar)

                    {

                        _nCodGenerico = int.Parse(frmPesquisa.sCdCodigo);

                    }

                }

                return bLocalizar;

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message.ToString());

            }

        }

 Carrega Valores –

public override void CarregaValores()

        {

            try

            {

                //Instancio a classe e o DataRow, que recebe o método PesquisaID de minha classe

                AcessoDadosConsulta objConsulta = new AcessoDadosConsulta(_nCodGenerico);

                DataRow dr = objConsulta.PesquisaID();

                //Se o DataRow for diferente de nulo, preencho as propriedades

                if (dr != null)

                {

                    dtConsulta.Value = DateTime.Parse(dr["DATACONSULTA"].ToString());

                    dtHrInicio.Value = DateTime.Parse(dr["HORAINICIO"].ToString());

                    dtHrFim.Value = DateTime.Parse(dr["HORAFIM"].ToString());

                    txtObservacoes.Text = dr["OBSERVACOES"].ToString();

                }

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message.ToString());

            }

        }

 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 int como 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.

 Assim finalizo o artigo. Muito obrigado a todos

 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.

 Um abraço, e até o próximo artigo.

Wellington Balbo de Camargo

Wellington Balbo de Camargo - Desenvolvedor Web/Desktop em .NET, com pouco mais de 1 ano de experiência na área. Cursando o 4º Semestre de Análise de Sistemas, atualmente estuda para melhorar os conhecimentos em SQL Server e ASP.NET, buscando em um futuro próximo as certificações Microsoft nessas áreas. Mantém um blog com dicas e artigos para iniciantes em .NET no endereço http://programandodotnet.wordpress.com e nas horas vagas procura ajudar e aprender com o pessoal do Fórum daMSDN. Atualmente é editor de artigos da Linha de Código.