2009-08-10 5 views
1

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

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

Prefs preferencias = new Prefs; 

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

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

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

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

Пользователь может ВГА несколько формы Preferences.

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

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

ответ

5

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

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

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

0

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

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

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

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

+0

Это кажется немного назад, но оно будет работать, если вы не хотите, чтобы диалог настроек был модальным (это похоже на очевидный выбор). –

+0

Обновлено мое сообщение с аргументацией по первому методу. –

0

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

+0

Я думаю, что это за борт, когда OP просто нуждается в модальном диалоге. –

2

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

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

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

Смежные вопросы