2010-01-07 8 views
7

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

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

вот мой код для окна справки, все остальные формы открываются одинаково.

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Form help = new help(); 
      help.Show(); 
     } 

ответ

10

Используйте Singleton:

class HelpForm : Form 
{ 
    private static HelpForm _instance; 
    public static HelpForm GetInstance() 
    { 
    if(_instance == null) _instance = new HelpForm(); 
    return _instance; 
    } 
} 

....... 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    HelpForm form = HelpForm.GetInstance(); 
    if(!form.Visible) 
    { 
     form.Show(); 
    } 
    else 
    { 
     form.BringToFront(); 
    } 
} 
+1

Создание переменной _instance null при закрытии формы будет идеальным с этим :) –

+0

@mletterle ваш код, кажется, имеет ошибку, поскольку нестатическая переменная не может использоваться внутри статического метода – ako

+0

Спасибо, исправлено .. – mletterle

2

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

  1. Используйте Singleton pattern с глобальной блокировкой отслеживания, которая выделяется, когда форма расположена
  2. Управления состояния в вызывающую форму и просто вызывать «показать», если форма уже запущена.
  3. Prelaunch форма, но не показывают, что способ управлять одной ссылки и просто показать его по мере необходимости
-3

Попробуйте сделать вашу Помощь форму глобальной.

private Form help; 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
     if(help == null) 
      help = new help(); 

     help.Show(); 
    } 
+1

downvoter, объясните пожалуйста. – junmats

10

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

btn_LaunchHelp(object o, EventArgs e) 
{ 

    foreach (Form f in Application.OpenForms) 
    { 
     if (f is HelpForm) 
     { 
      f.Focus(); 
      return; 
     } 
    } 

    new help().Show(); 
} 

Edit: Для того, чтобы быть более ясным, что позволяет пользователю для закрытия справки в любое время, и упростить управление гораздо проще, чем сохранить ссылку на окно справки. Ничего не убирать, ничего не поддерживать.

-1

Рассматривали ли вы форму MDI? Это гарантирует, что ваша родительская форма всегда видна, а ваши дочерние формы содержатся внутри родителя. Затем вам нужно только пройти список ваших форм и вызвать Show на них. Никаких синглтонов не требуется (что многие считают плохой практикой программирования в любом случае).

0

Возможно, это поможет вам.

private Form help; 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (help == null || (help != null && help.IsDisposed)) 
     { 
      help = new Form(); 
     } 
     if (!help.Visible) 
     { 
      help.Show(); 
     } 
     else 
     { 
      help.BringToFront(); 
     } 
    } 
0

Вы можете продолжить, как это, объявить theese 2 переменные в верхней части:

private static readonly object MyLock = new object(); 
private static Form1 _Instance = null; 

И после того, как

public Form1 GetFormInstance 
{ 
     get 
     { 
      lock (MyLock) 
      { 
       if (_Instance == null || _Instance.IsDisposed) 
       { 
        _Instance = new Form1(); 
       } 
       else 
       { 
        _Instance.BringToFront(); 
       } 
       return Form1._Instance; 
      } 
     } 
} 

Помещенный в Form1_FormClosed случае

Form1._Instance = null 

После позвоните в форму:

Form1.GetFormInstance.Show(); 

Надеюсь, это поможет.

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