2012-01-23 2 views
8

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

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

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

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

+0

попробовать this.close() –

ответ

8

Необходимо указать 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 
     } 
    } 

P.S. Close полностью закрывает ваше приложение, если оно является основной формой вашего приложения.

+1

Если вы скрываете MainForm в это нагрузка перед тем, как отобразить форму входа в систему, вы сможете более точно повторить пользовательскую функцию открытия формы входа в систему. – Servy

1

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

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

Попробуйте что-то больше, как это:

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

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

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

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

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

1

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