Passando Parâmetros Para Outros Forms
Neste tópico vamos aprender como passar um valor de um form para outro. Vou aproveitar nossa aplicação de cadastro de clientes para demonstrar, mas se você estiver apenas procurando uma forma de transferir uma variável para outro form e não está acompanhando o minicurso desde o início, não tem problema. O exemplo também lhe servirá e a forma de fazer essa "passagem" da informação é muito simples.
Bem, agora vamos trabalhar com a alteração de dados de clientes já cadastrados em nossa pequena aplicação. A ideia será reaproveitar o formulário de cadastro de clientes, ou seja, o frmCadastroCliente, para efetuar essa alteração, então, para isso veremos uma técnica bastante interessante, que é a passagem de parâmetro (ou de uma variável) para outro formulário. O processo é muito simples e para isso faremos uma sobrecarga do método construtor do formulário de cadastro e, de acordo com o parâmetro passado, ele se comportará como um formulário de cadastro ou de atualização dos dados.
Antes de chegarmos a estes pontos, vamos preparar o código já pronto. Como primeiro passo vamos criar, no formulário de Cadastro de Clientes, portanto o frmCadastroCliente, um método para popular o ComboBox de Estados, já que até o momento o código responsável por isso está colocado no método Load do formulário de cadastro.
Esse trecho de código ficará assim:
A chamada para esse novo método criado será feita dentro do método construtor, logo abaixo do InitializeComponent(), da seguinte forma:
Agora vamos abrir o formulário de Alteração de Clientes e vamos adicionar um DataGridView a ele.
Notem que já o redimensionei para ocupar quase todo o espaço disponível no formulário e já desmarquei os 3 checkboxes que por padrão são selecionados. Também já o renomeei para dtgBuscaParaRemocao e alterei seu fundo para a cor "LightCyan", para ficar igual ao DataGridView que usamos no formulário de remoção de clientes.
É importante observar se as opções abaixo estão corretamente definidas com os seguintes valores:
AutoSizeColumnsMode = Fill
ReadOnly = True
AllowUserToAddRows = False
AllowUserToDeleteRows = False
ColumnHeaderHeightSizeMode = AutoSize
Ainda no formulário de Alteração de Clientes, vamos criar as duas variáveis que se tornarão objetos para conexão e manipulação dos dados do banco, que são:
private MySqlConnection minhaConexao;
private MySqlDataAdapter objAdapter;
Elas podem ficar acima do método construtor, como ilustra a figura abaixo:
Agora vamos inserir um botão "Alterar", conforme imagem abaixo:
Eu o chamei de "btnAlterar". Na sequência vamos inserir, dentro do evento Click do botão "Procurar", o código para exibição dos clientes encontrados no banco. Os comandos são exatamente iguais ao botão "Procurar" do formulário de Remoção, portanto teremos:
Com isso conseguiremos a exibição dos dados dentro do DataGridView. Agora precisamos pegar o email do cliente selecionado, exatamente como fizemos no formulário de Remoção, portanto, já no código do evento Click do botão "Alterar", colocaremos:
Nesse instante teremos, na variável “temporaria”, o email do cliente cujos dados queremos alterar. Agora faremos a parte interessante do código, que é a chamada ao formulário de Cadastro, porém através da sobrecarga do seu método construtor. Ainda dentro do do código do evento Click do botão "Alterar", abaixo do trecho demonstrado acima, colocaremos:
frmCadastroCliente fcc = new frmCadastroCliente(temporaria);
fcc.ShowDialog();
Comentando...
Agora vem outra parte muito importante do tópico, que é a sobrecarga em si. Vamos abrir o formulário de Cadastro de Cliente e fazer a seguinte alteração:
Agora que já criamos o método sobrecarregado, vamos fazer uma pausa para entedermos a dinâmica deste formulário depois da alteração. A ideia do processo de alteração de dados dos clientes é que o usuário acesse, através do menu, o formulário de alteração. Então ele faz uma busca pelo nome (ou parte dele) e dentro do DataGridView tenhamos os resultados encontrados. Na sequência ele seleciona o usuário cujos dados devem ser alterados e clica no botão "Alterar". Este botão chamará o formulário de cadastro de clientes, mas passará, como parâmetro, o email do cliente selecionado. Então, já dentro do formulário de cadastro, o sistema perceberá que foi passado um parâmetro e acionará o construtor sobrecarregado. A partir deste ponto todos os dados do cliente serão automaticamente inseridos em seus respectivos campos, para que o usuário possa altera-los como desejar. Vamos, então, para essa reta final, que é a colocação dos dados nos campos do formulário.
O primeiro passo para isso será inserir uma variável do tipo MySQLAdapter, pois o formulário de Cadastro ainda não a tinha, já que para o cadastro simples não fazíamos uso dele. Agora teremos:
Como segundo passo iremos fazer um SELECT no banco, para resgatar todos os dados do cliente que terá seus dados alterados, e armazena-los em um DataTable.
Nosso código do construtor sobrecarregado será assim:
A grande observação no código acima fica por conta da variável emailCliente, que é, na verdade, o email do cliente capturado no formulário anterior e passado como parâmetro para cá. Na sequência já criei o DataTable que receberá os dados dessa consulta no banco de dados.
A partir daqui a ideia é ler cada campo (coluna) do DataTable e colocar os dados encontrados nos campos do formulário. O código completo deste procedimento será:
Comentando, teremos:
Agora, ao executarmos a aplicação, entrarmos no formulário de alteração de dados, selecionarmos um cliente, e clicarmos no botão "Alterar", os dados já serão automaticamente inseridos no formulário de cadastro, como ilustra a imagem abaixo:
Eu destaquei o título e o botão "Salvar", como duas falhas, afinal de contas, nesse instante o formulário não está atuando como cadastro de clientes, mas sim como formulário de alteração de dados. O botão também não deve ser o "Salvar", mas sim "Atualizar". Vejam agora mais dois macetes para corrigirmos estas pequenas falhas. Primeiramente vamos trabalhar o título, fazendo a alteração dinâmica do seu texto. Para isso, ainda dentro do construtor sobrecarregado, após o código responsável pelo preenchimento dos campos TextBox, vamos inserir o comando “this.Text”, conforme ilustra a figura abaixo:
Agora vamos executar e ver a diferença:
Notem que o título do formulário foi dinamicamente alterado para “Alteração de Dados”.
Agora vamos nos concentrar no botão. Aqui a estratégia será diferente, pois até poderíamos alterar a sua propriedade Text para o valor "Atualizar", no entanto o código associado a este botão é adequado para o salvamento no banco e não para uma atualização. A ideia aqui será a seguinte: como primeiro passo vamos inserir um novo botão exatamente em cima do botão "Salvar", então vamos chama-lo de "btnAtualizar" e definirmos seu texto para o valor "Atualizar", conforma ilustra a imagem abaixo:
No exemplo acima eu o coloquei levemente deslocado em relação ao botão "Salvar", apenas para que fique claro que um está sobre o outro, mas vocês podem coloca-lo exatamente sobre o botão inserido anteriormente.
O macete agora é definirmos, para este novo botão, que chamamos de "btnAtualizar", a propriedade Visible com valor False.
A ideia é que o formulário seja aberto, por padrão, com o botão de "Salvar" sendo exibido e o botão de "Atualizar" oculto. No entanto, quando o método construtor sobrecarregado for acionado, ou seja, quando quisermos, de fato, que o formulário atue como um atualizador de dados, vamos inverter essa lógica, tornando oculto o botão de "Salvar" e exibindo o botão de "Atualizar". Para isso adicionaremos o seguinte trecho, também dentro do método construtor sobrecarregado:
Estes comandos farão a inversão do botão que será exibido.
Agora, para encerrar, basta que façamos a inserção do código referente ao evento Click do btnAtualizar, mas para isso é preciso que nos atentemos para uma questão interessante, vejam: a chave primária da nossa tabela é o campo de email, por isso ele é sempre a referência para as operações de remoção de clientes. Agora usaremos esse mesmo campo como referência para a atualização de dados, mas pode acontecer do usuário querer atualizar o próprio email do cliente cadastrado. Nesse caso será necessário que saibamos o email cadastrado no banco ANTES da alteração, para que possamos usa-lo na propriedade WHERE do comando SQL. O procedimento para isso é muito simples. Vamos criar uma variável do tipo string que fará esse armazenamento. Uma sugestão de código é:
Aí está a variável criada e, faremos a inserção do email antigo nela dentro do método construtor sobrecarregado, conforme imagem abaixo:
Agora podemos prosseguir e finalizar o código do botão "Atualizar", que ficará da seguinte forma:
Como observações importantes deste código, ficam a concatenação da variável emailAntigo no comando MySQL, a alteração da mensagem de sucesso, que era de “Cliente gravado com sucesso!” e eu alterei para “Cliente atualizado com sucesso!” e vale destacar também que antes de cada concatenação dos TextBoxes, é necessário inserir as aspas simples, ou seja, é necessário envolver os TextBoxes em aspas simples. Sem isso o MySQL vai gerar uma exceção.
Agora vamos tentar atualizar os dados de algum cliente:
Aí está a confirmação de que os dados foram corretamente atualizados.
No entanto, antes de encerrarmos este tópico, tenho duas observações a fazer. A primeira é que, ao clicar no botão de OK da MessageBox de Sucesso, podemos perceber que o formulário frmAlteraCliente é novamente exibido em primeiro plano, mas os dados contidos no DataGridView não estão atualizados. Vamos corrigir isso. O primeiro passo é transformarmos o código que faz o preenchimento dos dados no DataGridView em um método separado, pois até este momento ele está “solto” dentro do bloco de código do evento Click do botão "Procurar".
Na prática pegaremos todo o código deste bloco e o colocaremos em uma função separada, como demonstra a imagem abaixo:
Resumindo, o antigo código do botão "Procurar" agora pertence a uma função separada e essa função é chamada quando o botão "Procurar" é clicado.
Agora, depois do comando que chama o método sobrecarregado no formulário de cadastro, chamaremos esse método de atualização do DataGridView novamente, vejam:
Agora, após o usuário efetuar as alterações e retornar ao formulário de Alteração de Clientes, automaticamente o DataGridView será atualizado.
A segunda observação é por conta dos dados exibidos no campo Data de Nascimento, pois além da data estão sendo exibidos outros caracteres, como ilustra a imagem abaixo:
Isso acontece devido a uma pequena falha do MySQL Server 5.1, que permite que campos do tipo Date ('0000-00-00') recebam dados no formato Datetime ('0000-00-00 00:00:00'). Na verdade eles não foram inseridos, mas ainda assim o MySQL os considera como vazios, por isso no momento do DataTable ser preenchido ele acaba recuperando os zeros referentes ao tempo.
Se o seu MySQL não apresentou essa pequena falha, ótimo, mas se apresentou, não se preocupe, pois a solução é muito simples. Vejam:
Inseri o retorno do DataTable em uma variável temporária e depois, com o método Substring, desprezei os caracteres vazios referentes ao tempo.
Agora, ao executar a aplicação, teremos o campo exibindo os dados corretamente:
Bem, com isso encerramos a parte de alteração de dados. Na sequência veremos uma etapa muito simples, praticamente sem qualquer novidade, que é como inserir máscara para o preenchimento da data, como obrigar o preenchimento de todos os campos e como impedir que o usuário clique no botão "Atualizar" sem ter selecionado nenhum usuário no DataGridView, o que por enquanto gera um erro.