none
Como fazer um Logout saindo do frmMenuPrincipal e retonorando para o frmLogin - C# RRS feed

  • Pergunta

  • Pessoal, confesso que estou apanhando feio... Tenho um form de Login e eu consegui implementar normalmente o Login...


    Após digitar a senha abre o frmPrincipal:

    Na classe Program.cs o código ficou assim:

    /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                frmLogin frm_Login = new frmLogin();
                
                if (frm_Login.ShowDialog() == DialogResult.OK)
                {
                    Application.Run(new frmMenuPrincipal());
                }        
            }

    E no botão ENTRAR  do frmLogin ficou assim:

    this.DialogResult = DialogResult.OK;

    Até aqui, tudo bem... Só que quando eu acesso o frmMenuPrincipal e preciso trocar de usuário (Logout), precisava fechar o frmMenuPrincipal e retornar ao frmLogin...

    Como eu faço isso... Alguém sabe como me ajudar???

    Abraço :)


    domingo, 14 de fevereiro de 2016 22:35

Respostas

  • Boa noite.

    Acredito que a forma mais simple de fazer seja a seguinte: não defina um Form principal; trate o Application.Exit() diretamente pelo código.

    Assim no Login tu podes verificar se o usuário está correto, instanciar e mostrar a tela principal e dar um this.Close(); mesma lógica funcionaria para o Form principal.

    O restultado final ficaria algo do tipo:

    Program.cs

            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                FormLogin frmLogin = new FormLogin();
                frmLogin.Show();
    
                Application.Run();
            }

    Form de Login:

            private void btnLogin_Click(object sender, EventArgs e)
            {
                // Valida se o usuário está correto e etc., caso esteja, executa o código a seguir
    
                FormDashboard frmDashboard = new FormDashboard();
                frmDashboard.Show();
    
                this.Close();
            }

    Form Principal:

            private void btnLogout_Click(object sender, EventArgs e)
            {
                FormLogin frmLogin = new FormLogin();
                frmLogin.Show();
    
                this.Close();
            }
    
            private void btnExit_Click(object sender, EventArgs e)
            {
                Application.Exit();
            }

    Att., Rafael Simor

    • Marcado como Resposta Jalber Romano segunda-feira, 15 de fevereiro de 2016 14:30
    segunda-feira, 15 de fevereiro de 2016 04:13

Todas as Respostas

  • Boa noite.

    Acredito que a forma mais simple de fazer seja a seguinte: não defina um Form principal; trate o Application.Exit() diretamente pelo código.

    Assim no Login tu podes verificar se o usuário está correto, instanciar e mostrar a tela principal e dar um this.Close(); mesma lógica funcionaria para o Form principal.

    O restultado final ficaria algo do tipo:

    Program.cs

            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                FormLogin frmLogin = new FormLogin();
                frmLogin.Show();
    
                Application.Run();
            }

    Form de Login:

            private void btnLogin_Click(object sender, EventArgs e)
            {
                // Valida se o usuário está correto e etc., caso esteja, executa o código a seguir
    
                FormDashboard frmDashboard = new FormDashboard();
                frmDashboard.Show();
    
                this.Close();
            }

    Form Principal:

            private void btnLogout_Click(object sender, EventArgs e)
            {
                FormLogin frmLogin = new FormLogin();
                frmLogin.Show();
    
                this.Close();
            }
    
            private void btnExit_Click(object sender, EventArgs e)
            {
                Application.Exit();
            }

    Att., Rafael Simor

    • Marcado como Resposta Jalber Romano segunda-feira, 15 de fevereiro de 2016 14:30
    segunda-feira, 15 de fevereiro de 2016 04:13
  • Bom dia Jalber,

    No seu botão de logout, você pode chamar o seu form inicial da seguinte maneira:

    private void btnLogout_OnClick(object sender, EventArgs e)
    {
        this.Hide();
        Form2 frmPrincipal = new Form2();
    
        frmPrincipal.Show();
        //OU
        frmPrincipal.ShowDialog();
    
    }

    Usando o método HIDE, o código do evento do botão continua em execução normalmente, porém se você utilizar o método CLOSE o seu código para de ser executado.

    Abs.

    Bruno Destro


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/

    segunda-feira, 15 de fevereiro de 2016 10:21
  • FormDashboard, nunca trabalhei.. Qual namespace devo usar? ou qual referência?
    segunda-feira, 15 de fevereiro de 2016 14:25
  • Jalber, FormLogin e FormDashboard são os nomes que dei aos meus Form's; é só adaptar pros nomes dos teus Forms.

    Edit: Aliás, cuidado com o Hide(), pois se tu ficares dando login e logout, os Forms ficarão em memória, ocupando espaço.


    Att., Rafael Simor


    • Editado SimorC segunda-feira, 15 de fevereiro de 2016 14:29
    • Sugerido como Resposta Ricardo dos Sntos terça-feira, 16 de fevereiro de 2016 00:12
    segunda-feira, 15 de fevereiro de 2016 14:28
  • Funcionou joinha Simor!!

    Obrigado... :)

    segunda-feira, 15 de fevereiro de 2016 14:30
  • Rafael, só uma dúvida: no frmMenuPrincipal eu implementei o botão de Logout com Application.restart() e funcionou tb... Ele reseta o form principal e volta para o Login, mas tenho receio.. não sei se seria o correto tb....
    segunda-feira, 15 de fevereiro de 2016 17:51
  • Jalber, podes até funcionar, mas da forma que falei é mais confiável.

    Ao dar um Application.Restart() tu vais estar criando um novo processo, em algum momento o processo atual pode não fechar rápido o suficiente para permitir que o novo processo abra e também tu acabas perdendo um pouco a capacidade de customização; o programa pode dar problema se tu tratares o evento FormClosing, por exemplo.

    Levando em conta que tu tens um FormPrincipal e um FormLogin para acessar este, é mais fácil trabalhar com o .Close() e com as instâncias.


    Att., Rafael Simor

    • Sugerido como Resposta Ricardo dos Sntos terça-feira, 16 de fevereiro de 2016 00:13
    segunda-feira, 15 de fevereiro de 2016 19:59
  • Entendi.... Obrigado Rafael ;)
    segunda-feira, 15 de fevereiro de 2016 20:08
  • Rafael fiz tudo direitinho, mas está tendo um problema com o frmLogin... No botão Cancelar eu implementei com Application.Exit().... e quando clicado encerra a aplicação.... BLZ!!

    Só que quando clico no botão X ( Fechar) A aplicação fica em aberto executando.... Ela não encerra... Como resolvo?

    segunda-feira, 15 de fevereiro de 2016 21:25
  • Bem lembrado, esqueci desse pequeno detalhe.

    Como não temos um Form como "principal", a applicação só termina quando damos um Application.Exit();

    Para resolver isso, crie um evento FormClosed nos Forms que o problema aparece e adicione o código:

                if (Application.OpenForms.Count == 0)
                {
                    Application.Exit();
                }

    Assim, caso não exista outros Forms abertos, a aplicação irá encerrar.


    Att., Rafael Simor

    • Sugerido como Resposta Ricardo dos Sntos terça-feira, 16 de fevereiro de 2016 00:13
    segunda-feira, 15 de fevereiro de 2016 21:50
  • Agora funcionou 100% show de bola!!!

    Obrigado Rafael ;)

    segunda-feira, 15 de fevereiro de 2016 22:20