Desenvolvimento - C#
Cadastro de um Consultório em Windows Forms, com C# e SQL Server – Parte 11
Na 11ª parte dessa série de artigos criaremos os códigos referentes aos métodos criados na parte 10, da classe de Consulta. Após isso, criaremos um novo formulário, que será o de Pesquisa das Consultas.
por Wellington Balbo de CamargoOlá 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 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, do ConsultaTableAdapter. 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 do ConsultaTableAdapter 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:
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 de ASP.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.
public DataTable Pesquisar()
{
try
{
//instancio o TableAdapter e o DataTable
ConsultaTableAdapter ta = new ConsultaTableAdapter();
dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();
//uso o método Fill do TableAdapter, passando como parâmetro o DataTable
ta.Fill(dt);
//retorno o DataTable preenchido
return dt;
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
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:
public int nCodConsulta { get; set; }
public int nCodMedico { get; set; }
public int nCodPaciente { get; set; }
public DateTime dDtConsulta { get; set; }
public DateTime dHrInicio { get; set; }
public DateTime dHrFim { get; set; }
public string sObservacao { get; set; }
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:
public override bool Salvar(bool bInsert)
{
try
{
//instancio o TableAdapter
ConsultaTableAdapter ta = new ConsultaTableAdapter();
//crio uma variável auxiliar, que será retornada preenchida no fim do método
bool bSalvar = false;
//verifico, se estiver inserindo, minha variável bSalvar recebe o método Insert
//do TableAdapter, passando como parâmetro as propriedades criadas no começo da classe
if (bInsert)
{
bSalvar = (ta.Insert(nCodMedico, nCodPaciente, dDtConsulta,
dHrInicio, dHrFim, sObservacoes, true) > 0);
}
//senão, uso o método Update e passo a propriedade bAtivo como parâmetro do método
else
{
bSalvar = (ta.Update(nCodMedico, nCodPaciente, dDtConsulta, dHrInicio,
dHrFim, sObservacoes, bAtivo, nCodConsulta) > 0);
}
return bSalvar;
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
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:
public override bool Delete()
{
try
{
//instancio o TableAdapter
ConsultaTableAdapter ta = new ConsultaTableAdapter();
//retorno o método Delete passando a propriedade nCodConsulta como parâmetro
return (ta.Delete(nCodConsulta) > 0);
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
Os próximos dois métodos PesquisaID serão iguais aos métodos das classes anteriores. Confira:
public override DataTable PesquisaID(int nCodGenerico)
{
try
{
//instancio o DataTable e o TableAdapter
dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();
ConsultaTableAdapter ta = new ConsultaTableAdapter();
//uso o método PesquisaID, passando como parâmetro o dt e a variável nCodGenerico
ta.PesquisaID(dt, nCodGenerico);
//retorno o DataTable preenchido
return dt;
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
public override DataRow PesquisaID()
{
try
{
//retorno apenas a primeira linha de minha consulta
return this.PesquisaID(nCodConsulta).Rows[0];
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
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.
public DataTable PesquisaNomePaciente(string sDsNomePaciente)
{
try
{
//instancio o DataTable e o TableAdapter
dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();
ConsultaTableAdapter ta = new ConsultaTableAdapter();
//uso o método PesquisaNomePaciente, passando como parâmetro o dt
//e os caracteres coringas, concatenados com a variável sDsNomePaciente
ta.PesquisaNomePaciente(dt, "%" + sDsNomePaciente + "%");
//retorno o DataTable preenchido
return dt;
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
public DataTable PesquisaNomeMedico(string sDsNomeMedico)
{
try
{
//instancio o DataTable e o TableAdapter
dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();
ConsultaTableAdapter ta = new ConsultaTableAdapter();
//uso o método PesquisaNomePaciente, passando como parâmetro o dt
//e os caracteres coringas, concatenados com a variável sDsNomeMedico
ta.PesquisaNomeMedico(dt, "%" + sDsNomeMedico + "%");
//retorno o DataTable preenchido
return dt;
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
Pronto, nossa classe está implementada. Agora vamos criar nosso formulário de Pesquisa que, 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 template InheritedForm, 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 para public (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 do GroupBox, GridView e dos dois Buttons.
Após fazer isso, dê um Build Solution (F6). Agora vá ao frmPesquisa, adicione um RadioButton com o text Nome do Médico para que fique dessa forma:
Em nosso form precisamos sobrescrever o método Pesquisar, criado no formulário base. Para isso, faça o seguinte:
public override void Pesquisar()
{
try
{
//instancio a Classe e o DataTable
AcessoDadosConsulta acesso = new AcessoDadosConsulta();
DataTable dt = new DataTable();
//verifico qual RadioButton está checado, dependendo de qual for, chamo o método adequado
if (rbtCodigo.Checked)
{
dt = acesso.PesquisaID(int.Parse(txtPesquisa.Text));
}
else if (rbtDescricao.Checked)
{
dt = acesso.PesquisaNomePaciente("%" + txtPesquisa.Text + "%");
}
else if (rbtNomeMedico.Checked)
{
dt = acesso.PesquisaNomeMedico("%" + txtPesquisa.Text + "%");
}
//crio um novo método para carregar os itens no ListView
Carregar(dt);
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
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):
private void Carregar(DataTable dt)
{
try
{
//limpo os registros do ListView
lstPesquisa.Items.Clear();
//carrego os dados no ListView
foreach (DataRow dr in dt.Rows)
{
//para cada linha de meu DataTable, insiro uma linha no ListView
//instancio o ListViewItem, adiciono os itens e subitens, referentes
//aos campos que estou pesquisando em meu ListView
ListViewItem item = new ListViewItem();
item.Text = dr["IDCONSULTA"].ToString();
item.SubItems.Add(dr["NOMEPACIENTE"].ToString());
item.SubItems.Add(dr["NOMEMEDICO"].ToString());
item.SubItems.Add(dr["DATACONSULTA"].ToString());
item.SubItems.Add(dr["HORAINICIO"].ToString());
//aqui adiciono a varíavel instanciada item
//carregada com o item e subitem ao ListView
lstPesquisa.Items.Add(item);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
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:
Vamos testar o form. Antes de rodá-lo, abra o Form1.cs (o form principal) e altere o botão que chama as Consultas:
private void toolStripButton3_Click(object sender, EventArgs e)
{
//frmConsulta consulta = new frmConsulta();
//consulta.ShowDialog();
frmPesquisa pesquisa = new frmPesquisa();
pesquisa.ShowDialog();
}
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.
Na próxima parte terminaremos nosso formulário aplicando algumas formatações e começaremos a criação do Cadastro de Consultas. 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