Passar variável para outro Form em C#

Olá a todos,
Gostaria de compartilhar uma dica em que, confesso, também já quebrei a cabeça para resolver. Como podemos passar variáveis, textos, números ou qualquer outro tipo de informação de um Form para outro em C#? Bem, na verdade é bem simples e, para exemplificar, fiz um pequeno projeto para ajudar no entendimento.


PS: Caso queiram fazer o processo inverso, pegando a variável do Form aberto, veja este post:
http://tutoriaiscsharp.blogspot.com.br/2013/09/pegar-variavel-do-form-aberto-em-csharp.html


Primeiro devemos alterar o método construtor do Form que receberá esta variável, ficando algo parecido com o código abaixo:

public frmSecundaria(string texto)
{
    InitializeComponent();
    lblTexto.Text = texto;
}

Onde o parâmetro "string texto" será a variável que o Form receberá e o "lblTexto.Text" é onde a variável será usada.

Já no Form em que chamará este outro Form, devemos apenas passar o parâmetro no momento da criação da instância do Form. Ficará assim:

private void btnAbrir_Click(object sender, EventArgs e)
{
    frmSecundaria novaForm = new frmSecundaria(tbTexto.Text);
    novaForm.Show();
}

Como puderam notar, é algo muito simples. Obviamente este foi um exemplo rápido, mas que pode ser aplicado a várias situações bem mais complicadas.

Se quiserem testar, o .exe compilado para o .NET Framework 4.0 do programa pode ser baixado no seguinte link: http://goo.gl/U5u8A
Já o projeto e código fonte completo do programa está em: http://goo.gl/SKSDZ

28 comentários:

  1. Caramba, valeu mesmo !!!!!!!!!!!!!!
    ajudou pacas, depois de um dia praticamente inteiro tentando !

    ResponderExcluir
  2. cara ta explicado muito por cima isso ai!
    que é esse tal de
    "(tbTexto.Text)"
    p.U

    ResponderExcluir
  3. Quando escrevo "tbTexto.Text" quero dizer quer que estou pegando a propriedade "Text" do controle chamado "tbTexto", que nesse caso é o textBox da primeira janela.
    Há alguns padrões para dar nomes aos objetos e, no caso dos textBoxes, usa-se as iniciais tb seguido de algum nome.

    Abraço

    ResponderExcluir
  4. Dahora eim, mas assim, como que eu faço do form 2 para o form 1...

    Fiz do mesmo jeito que esta no exemplo, eu debuguei e o form 1 está recebendo a informação porém ele não aplica, o campo não sute efeito nenhum...

    Alguém sabe me informar o que pode ser ?

    Obrigado desde já...

    ResponderExcluir
  5. e como faço isso com mais text boxes ???

    ResponderExcluir
    Respostas
    1. Ao invés de passar através do construtor apenas uma string, passe mais variáveis, ou mesmo um Array. O resto fica exatamente como no post.
      Qualquer coisa é só falar.

      Abraço

      Excluir
  6. tipo criar string valor1 , string valor2 e tal ?? mas porem quando eu vou adicionar ele acusa erro ... eu igualo textbox1.text = valor1; textbox2.text = valor2 ... e na hora de expor isso aki frmSecundaria novaForm = new frmSecundaria(textbox1.Text); // como faço para colocar o textbox2 aki ?
    novaForm.Show();

    ResponderExcluir
    Respostas
    1. Faça assim:
      frmSecundaria novaForm = new frmSecundaria(textbox1.Text, textbox2.Text, textbox3.Text); //etc... quantos quiser.

      Na outra form que irá receber os valores(formSecundaria no seu caso) você altera o método construtor, deixando-o desta forma:

      public frmSecundaria(string texto, string texto2, string texto3) //etc... quantos quiser também
      {
      InitializeComponent();
      //dentro o construtor use as variáveis texto1, texto2, texto3 como quiser, igualando nos locais desejados.

      }


      Se ainda tiver dúvidas é só falar.

      Até +

      Excluir
    2. Segui os passos acima para compartilhar mais variáveis e ficou assim:

      public FrmSecundario(string TxtcodigoUsuario, string TxtLoginLogin, string TxtNivelNivel) ///variavel de senha capturada do formulário Login
      {
      InitializeComponent();
      LblCodigousuario.Text = TxtcodigoUsuario;
      LblNivel.Text = TxtNivelNivel;
      LblUsuario.Text = TxtLoginLogin;
      }

      Sem problemas, só que no formulário principal quando vou carregar as variaveis ele dá mensagem de que as variaveis nao existe (TxtLoginLogin.Text, TxtNivelNivel).


      FrmPrincipal FormPrincipal = new FrmPrincipal(TxtCodigoUsuario.Text, TxtLoginLogin.Text, TxtNivelNivel);
      FormPrincipal.ShowDialog();

      O que estou fazendo de errado??

      Excluir
    3. Oi colega, acho que agora entendi o problema. Você está tentando passar a variável do form que foi aberto depois do que deseja que receba as informações.

      Neste caso você pode criar uma propriedade no form de DESTINO das informações desta forma:

      private static string textoGlobal;
      public static string TextoGlobal
      {
      get { return textoGlobal; }
      set { textoGlobal = value; }
      }

      E no form que dará ORIGEM as informações altere o valor da propriedade desta forma:

      frmPrincipal.TextoGlobal = "qualquer informação";

      *No form de destino você usará a variável com modificador private(iniciando letra minúscula), pois esta variável está encapsulada para esta classe.

      Veja se agora consegue fazer o que deseja.

      Abraço

      Excluir
  7. Boa tarde,
    Fiz o procedimento porém o valor não é passo para o formulário secundário.
    Estou usando o visual studio 2010.
    Quando ao comando tbTexto.Text, no meu dá um erro fala que o nome da variavel nao existe, quando eu tiro o "tb", nao dá erro, porem o valor nao é passado para o formulario secundario.
    Pode me ajudar?

    ResponderExcluir
    Respostas
    1. Quando escrevemos "tbTexto.Text" queremos informar que estamos pegando a propriedade "Text" do controle "tbTexto", que é um textBox. No meu código existe um textBox com este nome, porém no seu pode ser do nome que quiser. Para renomeá-lo basta clicar no textBox que arrastou para seu formulário e alterá-lo na janela de propriedades, que por padrão fica no canto inferior direito.

      Excluir
  8. Cara, olha só como eu fiz...
    <<< FORMULÁRIO SECUNDÁRIO >>>
    public FrmItensConsultoria(string EmpresaItens)
    {
    InitializeComponent();
    TxtEmpresaItensCons.Text = (EmpresaItens);
    }
    Onde EmpresaItens - Se refere a uma variável do tipo string que deve estar carregada com o campo chave do formulário principal.
    ------------------------------------------------------------------------------------
    <<< FORMULÁRIO PRINCIPAL >>>
    private void BtnInclui2_Click(object sender, EventArgs e)
    {
    FrmItensConsultoria FormItensConsultoria = new FrmItensConsultoria(TxtEmpresa.Text);
    FormItensConsultoria.ShowDialog();
    }
    Onde: TxtEmpresa.text é um campo do tipo textbox que carrega no formulário principal o campo chave.

    O problema é que quando acesso o formulário secundário, ele não carrega o campo chave do formulário principal.
    Não dá nenhum erro, apenas fica vazio.

    ResponderExcluir
    Respostas
    1. Oi, deveria funcionar. Está tudo certo.
      Veja se o "TxtEmpresa.text" está sendo alimentado corretamente antes do formulário secundário ser aberto.

      Antes do "FormItensConsultoria.ShowDialog()" adicione um MessageBox desta forma:
      "MessageBox.Show(TxtEmpresa.Text);" para testar.

      Excluir
  9. Bom dia Jhomps,
    Obrigado pela ajuda, ainda persiste um problema.
    No form Origem fiz como vc falou e está certo sem erros.
    No formdestino porém, a duvida é o seguinte:
    Em qual local eu devo colocar o comando:

    Em qual local eu devo colocar o comando: <>>

    se for quando eu chamar o formulário segundário, ele não reconhece a variável <>.


    ResponderExcluir
  10. alguem pode me ajudar quero digitar um valor no textbox e pareca no label.. depois esse melhor valor somar com outro valor que digito no texbox

    ResponderExcluir
    Respostas
    1. Oi Sthefanie, crie um TextBox e um Label no seu projeto. No evento KeyPress do TextBox você coloca este código:

      int somaTotal = 0;
      private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
      {
      if (e.KeyChar == 13) //Ao apertar enter o valor digitado será somado
      {
      somaTotal += int.Parse(textBox1.Text);
      label1.Text = somaTotal.ToString();
      }
      }

      Espero que ajude.
      Até mais.

      Excluir
  11. Como faço para pegar os dados de uma dbGrid e jogar no form que abriu a dbGrid, tipo uma consulta que abre um form, depois que eu clicar em cima ele pega esses dados e joga na tela anterior.

    ResponderExcluir
    Respostas
    1. Oi Ragner, basta você pegar a linha do Grid através do evento CellContentDoubleClick e passar para o Form anterior como está explicado neste post. Se precisar de ajuda é só falar.

      Abraço

      Excluir
  12. E se tiver um form com vários botões nomeados, como pegar o nome de cada um deles em outro form e em uma label, ?

    ResponderExcluir
    Respostas
    1. Olá, neste caso faça usando propriedades, como mostro nesta postagem: http://tutoriaiscsharp.blogspot.com.br/2013/09/pegar-variavel-do-form-aberto-em-csharp.html
      Abraço

      Excluir
  13. Este comentário foi removido pelo autor.

    ResponderExcluir
  14. Perfeito amigo, obrigado por compartilhar essa solução.

    ResponderExcluir
  15. como passar uma variavel para um arquivo em batch? A variavel vai ser a apk que o bat vai decompilar

    ResponderExcluir
  16. Nossa, você continua ajudando as pessoas... parabens... depois de muito tempo tentando, fazendo coisas mirabolantes, um simples exemplo salvou meu dia... Parabens

    ResponderExcluir
  17. boa noite; estou com uma duvida, somei dois valores.int x= convert.tobyte(a) + x= convert.tobyte(b); blz até ai tudo ok, porem quando eu somo 5+5 =10. pretendo pega esse valor 10 e passar a outro form, porém com valor 11. não estou tendo essa noção de logica, ou não conheço o metodo a ser usado. alguém me ajuda.

    ResponderExcluir
  18. public void a(int b, int c)
    {

    b = Convert.ToByte(textsoma1.Text);
    c = Convert.ToByte(textsoma2.Text);


    int f = Convert.ToByte(b) + Convert.ToByte(c);

    textLIST_1.Text += textLIST_1.Text = f.ToString() +"-";
    return;
    }

    ResponderExcluir

Não esqueça de enviar um comentário. Isto motiva o autor a continuar postando e também é uma forma de agradecimento