none
Como fazer um Form chamar outro Form e passar valores de um para o outro? RRS feed

  • Pergunta

  • Boa tarde a todos.

     

    Bem, o cenário é o seguinte:

     

    Minha aplicação Windows Forms (C# 2.0) possui 2 Forms: o primeiro é o MainForm que é o programa principal e possui uma GroupBox onde está inserida uma ListBox. Ao inicializar o sistema, o MainForm deve abrir um segundo Form (SecForm) que por sua vez possui uma CheckedListBox e um botão. O usuário seleciona alguns valores nas checkBoxes e quando clicar no botão, este deve passar os valores selecionados para o MainForm e inserir os valores escolhidos na ListBox que mencionei.

     

    A minha dúvida é: Como fazer para abrir o SecForm e depois como passar os valores de um form para os componentes do outro. Pesquisei no MSDN Library e não achei nada que pudesse me ajudar a solucionar essa questão.

     

    Grato pela atenção. Abraços a todos...

    segunda-feira, 26 de janeiro de 2009 14:59

Respostas

  • Fábio,

    Mude a propriedade Modifier do CheckBox do segundo form para public, isto torna este controle visível no form principal. Para acessar no primeiro form, faça o seguinte, no form principal:

    formSec form = new formSec();
    form.ShowDialod();
    this.CheckBox1.Checked = form.CheckBox2.Checked;

    []s,

     

     

    segunda-feira, 26 de janeiro de 2009 23:36
  • Boa tarde Fabio,

    Pelo oq entendi é assim: no evento Shown do seu MainForm coloque

    private void Form1_Shown(object sender, EventArgs e)
            {
    SecForm sform = new SecForm();
    sform.ShowDialog();
              
            }

    isso vai abrir o segundo form na hr da inicialização do seu programa,
    depois no SecForm vc vai colocar o seguinte:

    private static string checkbox1;
    private static string checkbox2;

    dai vc atribui a resposta dos check para cada uma variavel,

    la no seu MainForm vc faz:

    SecForm  sform = new SecForm();
    sform.checkbox1;
    ou

    sform.checkbox2;

    vc consegue os valores dos respectivos checks.

    qualquer coisa que entendi mal ou vc não entendeu pode postar novamente....

    Boa sorte.
    segunda-feira, 26 de janeiro de 2009 17:46
  • Olá Fábio,

     

    O tópico abaixo mostra um exemplo mais ou menos dentro do que você precisa. No formulário principal existe um DataGridView, e o usuário clica em um botão para abrir um segundo formulário, com todas as colunas que estão visíveis / invisíveis no DataGridView.

     

    O usuário pode, então, habilitar / desabilitar as colunas que deseja ver, e confirmar a operação, de forma que o DataGridView do formulário principal é atualizado com as escolhas feitas nesse segundo form (caixa de diálogo).

     

    Veja se ajuda:

    CheckedListBox
    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=4287320&SiteID=21


    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    terça-feira, 27 de janeiro de 2009 01:43
    Moderador
  • Olá Fabio,

     

    Seguindo os conselhos dos companheiros acima, ai vai mais uma dica.

     

    Caso vc deseje abstrair o controle do form 2, crie um método do tipo static que recebe o controle, e faça o tratamento dentro do método.

     

    public void static recebeCheckBox ( Checkbox ch)

    {

    //faca aqui o tratamento que deseja.

    }

     

     

    []'s

     

     

    Nelson Borges

    terça-feira, 27 de janeiro de 2009 04:01
  • Obrigado a todos pelas respostas!

     

    Rogério, fiz algo semelhante ao que vc sugeriu e consegui fazer o que queria.

     

    Consegui carregar o SecForm na inicialização exatamente como exemplificado por vc, mas para receber os checkboxes marcados do SecForm no MainForm, fiz de outra maneira, veja:

     

    No MainForm, fiz uma referência pública a ele no evento Load:

     

    Code Snippet

    public partial class MainForm : Form
        {
            public static MainForm frmMainProgram; // Fará referência ao Form Principal.

    ...

     

    private void MainProgram_Load(object sender, EventArgs e)
            {
                frmMainProgram = this; // Referência ao próprio Form Principal.           
            }

     

     

    A seguir, alterei o modificador da listBox no MainForm para public e direto no SecForm, fui inserindo os itens marcados no CheckdListBox direto no ListBox através de um loop for:

     

    Code Snippet

    private void btnOk_Click(object sender, EventArgs e)
            {
                // Lê as CheckBoxes selecionadas e os adiciona na ListBox em MainForm.
                for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
                {
                    MainForm.frmMainProgram.listBox1.Items.Add(checkedListBox1.CheckedItems[i]);
                }

                // Fecha o form.
                this.Close();
            }

     

     

    Dessa forma, sempre que precisar inserir ou retirar itens do ListBox, posso fazer e qualquer form da minha aplicação.

     

    Obrigado a todos que postaram, suas dicas serão muito úteis no aprimoramento deste projeto.

     

    Abraços a todos!

    terça-feira, 27 de janeiro de 2009 10:16

Todas as Respostas

  • Boa tarde Fabio,

    Pelo oq entendi é assim: no evento Shown do seu MainForm coloque

    private void Form1_Shown(object sender, EventArgs e)
            {
    SecForm sform = new SecForm();
    sform.ShowDialog();
              
            }

    isso vai abrir o segundo form na hr da inicialização do seu programa,
    depois no SecForm vc vai colocar o seguinte:

    private static string checkbox1;
    private static string checkbox2;

    dai vc atribui a resposta dos check para cada uma variavel,

    la no seu MainForm vc faz:

    SecForm  sform = new SecForm();
    sform.checkbox1;
    ou

    sform.checkbox2;

    vc consegue os valores dos respectivos checks.

    qualquer coisa que entendi mal ou vc não entendeu pode postar novamente....

    Boa sorte.
    segunda-feira, 26 de janeiro de 2009 17:46
  • Fábio,

    Mude a propriedade Modifier do CheckBox do segundo form para public, isto torna este controle visível no form principal. Para acessar no primeiro form, faça o seguinte, no form principal:

    formSec form = new formSec();
    form.ShowDialod();
    this.CheckBox1.Checked = form.CheckBox2.Checked;

    []s,

     

     

    segunda-feira, 26 de janeiro de 2009 23:36
  • Olá Fábio,

     

    O tópico abaixo mostra um exemplo mais ou menos dentro do que você precisa. No formulário principal existe um DataGridView, e o usuário clica em um botão para abrir um segundo formulário, com todas as colunas que estão visíveis / invisíveis no DataGridView.

     

    O usuário pode, então, habilitar / desabilitar as colunas que deseja ver, e confirmar a operação, de forma que o DataGridView do formulário principal é atualizado com as escolhas feitas nesse segundo form (caixa de diálogo).

     

    Veja se ajuda:

    CheckedListBox
    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=4287320&SiteID=21


    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    terça-feira, 27 de janeiro de 2009 01:43
    Moderador
  • Olá Fabio,

     

    Seguindo os conselhos dos companheiros acima, ai vai mais uma dica.

     

    Caso vc deseje abstrair o controle do form 2, crie um método do tipo static que recebe o controle, e faça o tratamento dentro do método.

     

    public void static recebeCheckBox ( Checkbox ch)

    {

    //faca aqui o tratamento que deseja.

    }

     

     

    []'s

     

     

    Nelson Borges

    terça-feira, 27 de janeiro de 2009 04:01
  • Obrigado a todos pelas respostas!

     

    Rogério, fiz algo semelhante ao que vc sugeriu e consegui fazer o que queria.

     

    Consegui carregar o SecForm na inicialização exatamente como exemplificado por vc, mas para receber os checkboxes marcados do SecForm no MainForm, fiz de outra maneira, veja:

     

    No MainForm, fiz uma referência pública a ele no evento Load:

     

    Code Snippet

    public partial class MainForm : Form
        {
            public static MainForm frmMainProgram; // Fará referência ao Form Principal.

    ...

     

    private void MainProgram_Load(object sender, EventArgs e)
            {
                frmMainProgram = this; // Referência ao próprio Form Principal.           
            }

     

     

    A seguir, alterei o modificador da listBox no MainForm para public e direto no SecForm, fui inserindo os itens marcados no CheckdListBox direto no ListBox através de um loop for:

     

    Code Snippet

    private void btnOk_Click(object sender, EventArgs e)
            {
                // Lê as CheckBoxes selecionadas e os adiciona na ListBox em MainForm.
                for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
                {
                    MainForm.frmMainProgram.listBox1.Items.Add(checkedListBox1.CheckedItems[i]);
                }

                // Fecha o form.
                this.Close();
            }

     

     

    Dessa forma, sempre que precisar inserir ou retirar itens do ListBox, posso fazer e qualquer form da minha aplicação.

     

    Obrigado a todos que postaram, suas dicas serão muito úteis no aprimoramento deste projeto.

     

    Abraços a todos!

    terça-feira, 27 de janeiro de 2009 10:16
  • Boa tarde Fábio,

    Acrescentando possibilidades...

    Uma forma para você fazer isso é através da propriedade Owner do formulário. Para isso você precisa:

    - No evento Load do Form1 você instancia o objeto Form2 e em seguida executa o método Show() do objeto instanciado informando quem será o Owner daquele formulário, neste caso será o objeto que chamou o segundo formulário

    private void Form1_Load(object sender, EventArgs e)
    {

        Form2 f2 = new Form2();

        f2.Show(this);

    }

     

    Espero ter ajudado.



    Abraços,

    Marco Felde


    • Sugerido como Resposta Marco Felde terça-feira, 10 de fevereiro de 2009 11:57
    sexta-feira, 6 de fevereiro de 2009 17:17