2012-10-19 5 views
3

Я разрабатываю приложение C# Windows Forms. Я хотел бы иметь один экземпляр всех форм.Отдельный экземпляр всех форм WinForm

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

Как я могу это достичь?

ответ

8

Проверьте, если форма существует в совокупности открытых формах, прежде чем создавать и показывать форму с помощью Application.OpenForms

if (System.Windows.Forms.Application.OpenForms["Form1"] as Form1 != null) 
     MessageBox.Show("Form1 is opened"); 
else 
     MessageBox.Show("Form1 is not opened"); 
1

Попробуйте этот комбо

Первый замыкающий контакт формируют глобальный объект

private ContactForm contactForm; 

Затем обработчик контактной кнопки:

private void contactButton_Click(object sender, EventArgs e) 
{ 
    if (contactForm == null) 
    { 
     contactForm = new ContactForm(); 
     contactForm.FormClosing += new FormClosingEventHandler(contactForm_FormClosing); 
    } 
    contactForm.Show(); 
} 

Затем обработайте событие FormClosing в ContactForm, чтобы скрыть его, а не близко это:

private void contactForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    contactForm.Hide(); 
    e.Cancel = true; 
} 

Или, если вы хотите контактную форму, чтобы закрыть, и открыт как новый следующий раз, ручки FormClosed вместо:

private void contactForm_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    contactForm = null; 
} 

Затем в следующий раз, когда нажимается кнопка, предложение null if будет поймано, и форма будет установлена ​​в новый экземпляр и будет открыта.

2

Простой, как:

Form fc = Application.OpenForms["Form1"]; 
      if (fc != null) 
      { 
       fc.Focus(); 
      } 
      else 
      { 
       Form1 f1 = new Form1(); 
       f1.Show(); 
      } 
3
public static Form GetOpenedForm<T>() where T: Form { 
    foreach (Form openForm in Application.OpenForms) { 
     if (openForm.GetType() == typeof(T)) { 
      return openForm; 
     } 
    } 
    return null; 
} 

И в вашем коде, где вы создаете ContactForm:

ContactForm form = (ContactForm) GetOpenedForm<ContactForm>(); 
if (form == null) { 
    form = new ContactForm(); 
    form.Show(); 
} else { 
    form.Select(); 
} 
+2

Сделайте возвращаемое значение вашего статического метода 'T'. В этом случае вам не нужен листинг в вашем использовании: 'ContactForm form = GetOpenedForm ();' – Oliver

+0

Используя LINQ, вы можете сделать один лайнер из вашего вспомогательного метода: 'return Application.OpenForms.OfType .FirstOrDefault () ' – Oliver

+1

Это не работает, если форма минимизирована, поэтому вы можете добавить WindowState Normal. См. Мой ответ ниже –

1
Form2 form2 = null; 
private void button1_Click(object sender, EventArgs e) 
{ 
bool isFormExists = false; 
foreach (Form openForm in Application.OpenForms) 
{ 
    if (openForm == form2 && openForm!=null) 
    { 
    openForm.Focus(); 
    isFormExists = true; 
    break; 
    } 
} 

if (!isFormExists) 
{ 
    form2 = new Form2(); 
    form2.Show(); 
} 
} 
1

Вы можете отключить contactButton при щелчке и открытым contactForm -

private void contactButton_Click(object sender, EventArgs e) 
{ 
    contactButton.Enabled=false; 
    //code to open the contactForm 
} 

Когда contactForm закрыта, вы можете повторно включить Button-

contactButton.Enabled=true; 
1

Я бы с ответом Otiel в. Также вы можете добавить WindowState, потому что, если форма сведена к минимуму, она не будет показана. this Ответ может быть использован для получения метода восстановления.

ContactForm form = (ContactForm) GetOpenedForm<ContactForm>(); 
if (form == null) { 
    form = new ContactForm(); 
    form.Show(); 
} else { 
    //use this (if you want it to be restored to normal and focused) 
    //no need of extension method 
    //form.WindowState = FormWindowState.Normal; 
    //form.Select(); 

    //or use this if you want it to be restored as previous state and focused 
    //You need a Restore extension method that can be found in the link above 
    form.Focus(); 
    form.Restore(); 
} 
+1

Это не будет отлично работать, если «WindowState» был максимально (или максимизирован до минимального).Вы можете использовать метод «Восстановить» [здесь] (http://stackoverflow.com/a/2725234/825024) вместо изменения свойства «WindowState». – Otiel

+0

Да, в этом случае он вынужден идти в нормальное состояние. Это зависит от того, что вы хотите. Благодарю. –

+0

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

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