Как закрыть форму входа и показать основную форму без закрытия приложения? - PullRequest
41 голосов
/ 21 января 2011

В моем проекте есть две формы (Логин и Главная).

Я пытаюсь подтвердить, что, если вход выполнен успешно, я должен показать основную форму и закрыть форму входа.

У меня есть этот метод в форме входа, который закрывает форму входа при успешном входе. Но основная форма не отображается.

public void ShowMain()
{
    if(auth()) // a method that returns true when the user exists.
    {             
        var main = new Main();
        main.Show();
        this.Close();
    }
    else
    {
        MessageBox.Show("Invalid login details.");
    }         
}

Я попытался скрыть форму входа, если процесс входа прошел успешно. Но это беспокоит меня, потому что я знаю, что когда моя программа работает, форма входа еще там, она должна быть закрыта, верно?

Каким должен быть правильный подход к этому? Спасибо ...

Ответы [ 14 ]

100 голосов
/ 21 января 2011

Причина, по которой ваша основная форма не отображается, заключается в том, что как только вы закрываете форму входа, насос сообщений вашего приложения отключается, что приводит к закрытию всего приложения. Цикл сообщений Windows привязан к форме входа в систему, потому что это та, которую вы указали в качестве формы запуска в свойствах вашего проекта. Загляните в файл «Program.cs», и вы увидите ответственный код: Application.Run(new LoginForm()). Ознакомьтесь с документацией для этого метода здесь MSDN , которая объясняет это более подробно.

Лучшее решение - переместить код из формы входа в файл «Program.cs». Когда ваша программа запускается впервые, вы создадите и отобразите форму входа в виде модального диалога (который запускается в отдельном цикле сообщений и блокирует выполнение остальной части вашего кода до его закрытия). Когда диалоговое окно входа закроется, вы проверите его DialogResult свойство, чтобы увидеть, если вход был успешным. Если это так, вы можете запустить основную форму, используя Application.Run (создавая тем самым основной цикл сообщений); в противном случае вы можете выйти из приложения, не показывая никакой формы. Примерно так:

static void Main()
{
    LoginForm fLogin = new LoginForm();
    if (fLogin.ShowDialog() == DialogResult.OK)
    {
        Application.Run(new MainForm());
    }
    else
    {
        Application.Exit();
    }
}
8 голосов
/ 21 января 2011

Я бы сделал это наоборот.

В событии OnLoad для вашей главной формы отобразите форму входа в качестве диалогового окна.Если с результатом диалога все в порядке, тогда разрешите Main продолжить загрузку, если результатом является сбой аутентификации, прервите загрузку и покажите окно сообщения.

EDIT Пример кода (ов)

private void MainForm_Load(object sender, EventArgs e)
{
    this.Hide();

    LogonForm logon = new LogonForm();

    if (logon.ShowDialog() != DialogResult.OK)
    {
        //Handle authentication failures as necessary, for example:
        Application.Exit();
    }
    else
    {
        this.Show();
    }
}

Другим решением было бы показать LogonForm из метода Main в program.cs, что-то вроде этого:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    LogonForm logon = new LogonForm();

    Application.Run(logon);

    if (logon.LogonSuccessful)
    {
        Application.Run(new MainForm());
    }
}

В этом примере ваша LogonForm должна была бы выставить LogonSuccessfulСвойство bool, которое имеет значение true, когда пользователь ввел действительные учетные данные

5 голосов
/ 04 августа 2011

Все просто.

Вот код.

 private void button1_Click(object sender, EventArgs e)
 {  
        //creating instance of main form
        MainForm mainForm = new MainForm();

        // creating event handler to catch the main form closed event
        // this will fire when mainForm closed
        mainForm.FormClosed += new FormClosedEventHandler(mainForm_FormClosed);
        //showing the main form
        mainForm.Show();
        //hiding the current form
        this.Hide();
  }

  // this is the method block executes when main form is closed
  void mainForm_FormClosed(object sender, FormClosedEventArgs e)
  {
       // here you can do anything

       // we will close the application
       Application.Exit();
  }
4 голосов
/ 25 сентября 2015

Это моё решение.Создайте ApplicationContext, чтобы задать основную форму приложения и изменить основную форму, когда вы хотите открыть новую форму и закрыть текущую форму.

Program.cs

static class Program
{
    static ApplicationContext MainContext = new ApplicationContext();

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        MainContext.MainForm = new Authenticate();
        Application.Run(MainContext);
    }

    public static void SetMainForm(Form MainForm)
    {
        MainContext.MainForm = MainForm;
    }

    public static void ShowMainForm()
    {
        MainContext.MainForm.Show();
    }
}

Когда процесс входа в систему завершен.1007 *

Надеюсь, это поможет вам.

2 голосов
/ 10 августа 2015

Это самое элегантное решение.

private void buttonLogin_Click(object sender, EventArgs e)
{
    MainForm mainForm = new MainForm();
    this.Hide();
    mainForm.ShowDialog();
    this.Close();
}

; -)

2 голосов
/ 05 декабря 2012
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Login();
    } 

    private static bool logOut;

    private static void Login()
    {
        LoginForm login = new LoginForm();
        MainForm main = new MainForm();
        main.FormClosed += new FormClosedEventHandler(main_FormClosed);
        if (login.ShowDialog(main) == DialogResult.OK)
        {
            Application.Run(main);
            if (logOut)
                Login();
        }
        else
            Application.Exit();
    }

    static void main_FormClosed(object sender, FormClosedEventArgs e)
    {
        logOut= (sender as MainForm).logOut;
    }
}

public partial class MainForm : Form
{
    private void btnLogout_ItemClick(object sender, ItemClickEventArgs e)
    {
        //timer1.Stop();
        this.logOut= true;
        this.Close();
    }
}
2 голосов
/ 30 августа 2011

Вот простое решение, ваша проблема в том, что все ваше приложение закрывается, когда закрывается ваша форма входа?Если это так, то перейдите в свойства своих проектов и на вкладке приложения измените режим выключения на «Когда последняя форма закрывается» , так что вы можете использовать Me.close, не закрывая всю программу

0 голосов
/ 10 августа 2016

Эван, пост слишком старый, я хотел бы дать вам хитрость, чтобы сделать это, если вы хотите показать экран-заставку / вход в систему и когда индикатор выполнения экрана-заставки получил определенное значение / или успешный вход в систему произошел и закрыл экран-заставку / вход в системузатем снова отобразите основную форму, frm-main будет формой запуска, а не frm-spalash

в frm-main

public partial class frmMain : Form
{
    public frmMain()
    { 
        frmSplash frm = new frmSplash();
        frm.Show(); // new splash screen will shows
        this.Opacity=0; // will hide your main form
        InitializeComponent();
    }
 }

в frm-Splash

private void timer1_Tick(object sender, EventArgs e)
{
 int cnt = progressBar1.Value;

    switch (cnt)
    {
        case 0:
                //Do sum stuff
            break;
        case 100:

            this.Close(); //close the frm-splash
            frmMain.ActiveForm.Opacity = 100; // show the frm-main

            break;
    }

    progressBar1.Value = progressBar1.Value+1;
}

если вы используете его для формы входа

private void btlogin_Click(object sender, EventArgs e)
{
 bool login = false;

    //try your login here 
    //connect your database or whatever
    //and then when it success update login variable as true

        if(login == true){

            this.Close(); //close the frm-login
            frmMain.ActiveForm.Opacity = 100; // show the frm-main

        }else{
              //inform user about failed login
        }
}

обратите внимание, что я использую таймер и индикатор выполнения для управления действиями, которые вам не нужныдва это только ради полного ответа, надеюсь, это поможет

0 голосов
/ 03 июля 2012

попробуйте

 private void cmdLogin_Click(object sender, EventArgs e)
    {
        if (txtUserName.Text == "admin" || txtPassword.Text == "1")
        {

            FrmMDI mdi = new FrmMDI();
            mdi.Show();
            this.Hide();
        }
        else {

            MessageBox.Show("Incorrect Credentials", "Library Management System", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    }

и при выходе из приложения вы можете использовать

 Application.Exit();
0 голосов
/ 19 февраля 2012

лучший способ для отображения входа в систему и закрытия формы входа в систему до успешного входа в систему, поместите форму входа в FrmMain после InitializeComponent.

 public FrmMain()
 {
      FrmSplash FrmSplash = new FrmSplash();
      FrmSplash.ShowDialog();

      InitializeComponent();
      //Login Section
 {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...