Работа с формами - PullRequest
       4

Работа с формами

1 голос
/ 10 августа 2009

Я пишу программу, которая работает с 2 формами, основной формой и формой, в которой выполняется конфигурация, поэтому, когда пользователь нажимает toolstripmenu-> Preferences, отображается форма Preferences, и я хочу, чтобы она была только для пользователя способный иметь одну форму предпочтений за раз.

Когда я использую:

    Prefs preferencias = new Prefs;

    private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e)   
    {
        preferencias.Show();
    }

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

И когда я использую:

    private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e)   
    {
        Prefs preferencias = new Prefs;
        preferencias.Show();
    }

Пользователь может иметь несколько форм предпочтений.

Что я могу сделать?

Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 10 августа 2009

Звучит так, будто вам нужен модальный диалог, поэтому вам нужно использовать метод ShowDialog () вместо Show ():

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e)   
{
    preferencias.ShowDialog();
}
2 голосов
/ 10 августа 2009

ShowDialog (), предложенный другими, - хороший ответ. Если вы заинтересованы в альтернативе, вот что я иногда делаю:

private void FormClosing(object sender, FormClosingEventArgs e)
{
     if (e.CloseReason == CloseReason.UserClosing)
     {
        e.Cancel = true;
        Hide();
     }
}

То, что это делает, просто скрывает форму, так что если вы покажете ее снова, она уже загружена в память Кроме того, если у вас запущен таймер или какой-либо другой поток в этой форме, он все еще может работать и делать свое дело.

1 голос
/ 10 августа 2009
  preferencias.ShowDialog()

позволит открыть только одно окно настроек.

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

Если вы ищете 1 и ТОЛЬКО 1, вы, вероятно, захотите реализовать шаблон Singleton для класса Prefs.

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

Вы можете использовать свойство Application.OpenForms в событии click вашего элемента меню, чтобы проверить, открыта ли уже форма такого типа. Если форма такого типа не открыта, вы можете открыть свой экземпляр. Если есть, он просто не будет отображаться.

foreach (Form form in Application.OpenForms) {
    if (form.GetType() != typeof(PreferencesForm)) {
        new PreferencesForm().Show();
    }
}

Или, как уже было сказано, вы можете вызвать PreferencesForm.ShowDialog (), чтобы сделать форму модальной, и в этом случае пользователь должен закрыть форму, прежде чем он сможет снова взаимодействовать с основной формой.

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

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