none
Message box para fechar formulário RRS feed

  • Pergunta

  • Boa tarde pessoal, estou tendo dificuldade com um erro que acredito ser simples de resolver, tenho um form com um botão "voltar ao form principal", eu simplesmente quero que ao clicar nesse botão apareça uma confirmação se o usuário deseja mesmo voltar ao form principal (MessageBox). Se ele clicar em sim eu quero um método que feche o messageBox e o form atual e abra o outro form( o form principal). Estou usando o código abaixo mas ele funciona apenas para fechar o programa completamente, eu quero que se feche o form atual e abra o form principal como eu disse. Segue o código:

    public Login()
    {
    InitializeComponent();
    this.FormClosing +=new FormClosingEventHandler(Login_FormClosing);
    }
    
    
    private void Login_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
    {
    if (MessageBox.Show("Deseja voltar a tela inicial ?", "Sair", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
    {
    System.Environment.Exit(0);
    }
    else
    {
    e.Cancel = true;
    
    }
    
    }

    Desde já agradeço a todas as respostas!


    Roberto Gomez

    segunda-feira, 26 de outubro de 2015 19:26

Respostas

  • Boa tarde.

    No segundo Form tu podes criar uma referência do primeiro Form:

    // Segundo Form

    public FormPrincipal _formPrincipal { get; set;}

    E ao dar o Show() ou ShowDialog(), criar essa referência (ou passar por construtor do segundo Form também, no fim daria na mesma):

    // Primeiro Form
    
    SegundoForm segundoForm = new SegundoForm();
    segundoForm.FormPrincipal = this;
    this.Hide();
    segundoForm.Show();

    E ao fechar o segundo Form:

    // Segundo Form

    if (MessageBox.Show("Deseja voltar a tela inicial ?", "Sair", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { this._formPrincipal.Visible = true; this.Close(); }

    Obs.: Tu podes também criar uma classe estática com um atributo do tipo "FormPrincipal" que serviria como se fosse uma "Sessão", ou seja, no Load do teu FormPrincipal tu preenche esse "atributo global", digamos assim, e em qualquer classe tu podes pegar a referência do FormPrincipal através da classe estática:

    Classe estática:

    public static class FormGlobal
    {
       public static FormPrincipal _FormPrincipal { get; set; }
    }

    FormPrincipal:

    // Evento de Load do FormPrincipal
    FormGlobal._FormPrincipal = this;

    Em outros Forms (exemplo):

    if (MessageBox.Show("Deseja voltar a tela inicial ?", "Sair", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
    {
        FormGlobal._FormPrincipal.Visible = true;
        this.Close();
    }
    Essa classe estática faria com que tu não precisasse passar a instância do teu FormPrincipal toda vez que tu quiseres esconder e mostrar ele de outro Form.



    Att., Rafael Simor


    • Editado SimorC segunda-feira, 26 de outubro de 2015 20:34
    • Marcado como Resposta robertgomez2 segunda-feira, 26 de outubro de 2015 23:25
    segunda-feira, 26 de outubro de 2015 20:22

Todas as Respostas

  • Boa tarde.

    No segundo Form tu podes criar uma referência do primeiro Form:

    // Segundo Form

    public FormPrincipal _formPrincipal { get; set;}

    E ao dar o Show() ou ShowDialog(), criar essa referência (ou passar por construtor do segundo Form também, no fim daria na mesma):

    // Primeiro Form
    
    SegundoForm segundoForm = new SegundoForm();
    segundoForm.FormPrincipal = this;
    this.Hide();
    segundoForm.Show();

    E ao fechar o segundo Form:

    // Segundo Form

    if (MessageBox.Show("Deseja voltar a tela inicial ?", "Sair", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { this._formPrincipal.Visible = true; this.Close(); }

    Obs.: Tu podes também criar uma classe estática com um atributo do tipo "FormPrincipal" que serviria como se fosse uma "Sessão", ou seja, no Load do teu FormPrincipal tu preenche esse "atributo global", digamos assim, e em qualquer classe tu podes pegar a referência do FormPrincipal através da classe estática:

    Classe estática:

    public static class FormGlobal
    {
       public static FormPrincipal _FormPrincipal { get; set; }
    }

    FormPrincipal:

    // Evento de Load do FormPrincipal
    FormGlobal._FormPrincipal = this;

    Em outros Forms (exemplo):

    if (MessageBox.Show("Deseja voltar a tela inicial ?", "Sair", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
    {
        FormGlobal._FormPrincipal.Visible = true;
        this.Close();
    }
    Essa classe estática faria com que tu não precisasse passar a instância do teu FormPrincipal toda vez que tu quiseres esconder e mostrar ele de outro Form.



    Att., Rafael Simor


    • Editado SimorC segunda-feira, 26 de outubro de 2015 20:34
    • Marcado como Resposta robertgomez2 segunda-feira, 26 de outubro de 2015 23:25
    segunda-feira, 26 de outubro de 2015 20:22
  • Outra ideia, talvez até mais elegante, é criar um EventHandler (FormClosing) do segundo Form ao chamar o Show():

    // Evento que abre o segundo formulário
    {
        SegundoForm segundoForm = new SegundoForm();
        segundoForm.FormClosing += SegundoForm_FormClosing;
        SegundoForm.Show();    
    }
    
    void SegundoForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Visible = true;
    }

    E no SegundoForm seria um .Close() normal.


    Att., Rafael Simor


    • Editado SimorC segunda-feira, 26 de outubro de 2015 20:34
    segunda-feira, 26 de outubro de 2015 20:32