C# открытие новой формы и закрытие другой

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

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

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

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

5 ответов


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


попробуйте что-то вроде этого:

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

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

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

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

во-первых, вы скрыть форму входа.
Затем вы показываете главное диалоговое окно формы, но не разрешаете вызывающему объекту "ShowDialog ()" продолжать, пока диалоговое окно не будет закрыто.
Наконец, как только диалоговое окно закрыто, вы закрываете форму входа в систему, заканчивая приложение.


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

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

можно использовать 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(); 
}

как о ?