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 CamargoCadastro 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.