C # Открытие новой формы и закрытие другой - PullRequest
8 голосов
/ 23 января 2012

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

MainForm Main = new MainForm();
Main.Show();
this.Hide();

Это работает нормально, но есть проблема, форма входа по-прежнему открыта, даже если она скрыта, поэтому, когда программа закрыта, процесс все еще зависает, как я могу остановить это?

Извините, забыл добавить, использование this.Close(); не работает и полностью закроет программу.

Ответы [ 5 ]

10 голосов
/ 23 января 2012

Попробуйте что-то более похожее на это:

this.Hide();
Main.ShowDialog();
this.Close();

Вы хотите скрыть форму входа перед тем, как отобразить диалоговое окно, а затем закрыть форму входа после закрытия диалогового окна.

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

Проще говоря, расположите вещи в том порядке, в котором вы хотите их видеть, особенно при работе с циклами сообщений.

Сначала вы скрываете форму входа в систему.
Затем вы показываете диалоговое окно Основной формы, но не позволяете вызывающей стороне ShowDialog () продолжаться, пока диалоговое окно не будет закрыто.
Последнее, один раздиалоговое окно закрыто, вы закрываете форму входа, заканчивая приложение.

8 голосов
/ 23 января 2012

Вам необходимо указать MainForm при запуске приложения и в обработчике событий Load этой формы запросить логин.В этом случае у вас будет запущено приложение и Login для запуска:

Program.cs

    Application.Run(new MainForm());

MainForm.cs

    private void Form1_Load(object sender, EventArgs e)
    {
        LoginForm loginForm = new LoginForm();
        if (loginForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            // check login here
        }
    }

PS Close полностью закроет вашу заявку, если это основная форма вашей заявки.

1 голос
/ 22 мая 2015

Вы можете использовать ApplicationContext.MainForm, чтобы указать текущую основную форму для приложения:

static class Program
{
    public static ApplicationContext Context { get; set; }

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

        Context = new ApplicationContext(new LoginForm());
        // pass Context instead of just new LoginForm()
        Application.Run(Context);
    }
}

, затем войти в обработчик входа:

private void login_Click(object sender, EventArgs e)
{
    Program.Context.MainForm = new MainForm();

    // close login form
    this.Close();

    // set up context to track main form instead of login
    Program.Context.MainForm.Show(); 
}
1 голос
/ 23 января 2012

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

  • Если вынеобходимо иметь возможность закрыть приложение из формы входа в систему, используйте Application.Exit(0);
  • Если вы не хотите, чтобы они видели основной поиск формы и переопределить SetVisibilityCore и вызывать его внутри MainForm_Load.
0 голосов
/ 23 января 2012

Как насчет this.Close() вместо?

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