Закройте одну форму и отобразите другую - PullRequest
1 голос
/ 01 августа 2020

Мое приложение начинается с LoginForm, где пользователь вводит свои учетные данные. Мне нужно закрыть LoginForm и отобразить DashboardForm. Я могу сделать это:

public static bool OpenDashboardFormOnClose { get; set; }
public static bool OpenLoginFormOnClose { get; set; }

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

    OpenDashboardFormOnClose = false;
    OpenLoginFormOnClose = false;

    Application.Run(new LoginForm());

    if (OpenDashboardFormOnClose)
    {
        Application.Run(new DashboardForm());
    }           

    if (OpenLoginFormOnClose)
    {
        Application.Run(new LoginForm());
    }
}

Метод входа LoginForm:

Program.OpenDashboardFormOnClose = true;
this.Close();

Метод выхода DashboardForm:

Program.OpenLoginFormOnClose = true;
this.Close();

Это отлично работает, когда пользователь просто входит в систему, а затем выходит из нее. Проблема в том, что когда пользователь только что вышел из системы и пытается войти снова, приложение закрывается, а не отображает DashboardForm. Как мне этого добиться? Пользователь должен иметь возможность входить и выходить столько раз, сколько захочет ...

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 01 августа 2020

Просто используйте while l oop для многократного отображения форм входа и панели управления. Вам больше не понадобится флаг «OpenLoginFormOnClose», но он понадобится, чтобы отслеживать, следует ли вместо этого выйти из приложения:

static class Program
{

    public static bool OpenDashboardFormOnClose;
    public static bool ExitApplication = false;

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

        while(!ExitApplication)
        {
            OpenDashboardFormOnClose = false;
            Application.Run(new LoginForm());
            if (OpenDashboardFormOnClose)
            {
                Application.Run(new DashboardForm());
            }
        }
        
    }
}

Затем добавьте кнопку «выход» в вашу форму (формы), которая:

private void btnExit_Click(object sender, EventArgs e)
{
    Program.ExitApplication = true;
    this.Close();
}

Итак, теперь выпадет while l oop и ваша программа завершится.

0 голосов
/ 02 августа 2020
  1. this.Close или Close просто закрывает текущую форму, но если это основная форма, закрывает их все.

  2. Application.Exit() Закрывает все windows из одной программы.

  3. Существует нет возможный способ просто закрыть основную форму. если вы сделаете это, все windows, открытые из него, закроются. Вы можете только скрыть форму.

Чтобы скрыть форму, проверьте код ниже

private void Example_Click(object sender, EventArgs, e)
{
    this.Hide();
    this.ShowInTaskbar = false;
}

если вы находитесь в форме панели управления и хотите закрыть все оставшиеся windows с помощью / или из него, используйте

Application.Exit();

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

new DashBoardForm().Show();
0 голосов
/ 01 августа 2020

Я действительно не рекомендую использовать этот подход, когда несколько Application.Run используются один за другим для отображения последовательных форм. Этот метод запускает основное сообщение l oop программы и обычно запускается один раз при запуске программы и возвращается только один раз при выходе из программы.

Вместо этого заставьте формы открывать друг друга по мере необходимости и оставить главное сообщение l oop в одиночку. Давайте изменим его, чтобы вернуться в состояние почти по умолчанию:

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

    //Open the initial formm I'm assuming it's the login
    LoginForm loginForm = new LoginForm();
    loginForm.Show();

    //Start the main message loop for the whole lifetime of the program
    Application.Run();
}

Теперь в форме входа, когда пришло время закрыть ее и запустить основную форму, она сделает это сама вместо делегирования:

//Close itself
this.Close();
//Launch the next form
DashboardForm dashboardForm = new DashboardForm();
dashboardForm.Show();

Точно так же на панели управления при выходе вам нужно будет перезапустить вход в систему:

//Close itself
this.Close();
//Show the login again
LoginForm loginForm = new LoginForm();
loginForm.Show();

Хотя все это работает, это создает проблему, которой раньше не было. Поскольку основной Application.Run не привязан к форме, он не перестанет работать после того, как будет выполнен первоначальный вход в систему, а только тогда, когда будет явно указано это сделать, с результатом net зависания процесса после закрытия окна. .

Чтобы исправить это, когда пришло время закрыть приложение навсегда (не запускать другую форму), позвоните Application.Exit();, возможно, в событии Form.Closing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...