2010-11-03 3 views
4

Я хочу ограничить пользователя созданием нескольких экземпляров формы в приложении MDI.Ограничение количества экземпляров окон в приложении MDI

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

Как я могу это сделать?

ответ

5

Вы можете сделать это следующим образом.

Создание статического метода:

public static Form IsFormAlreadyOpen(Type FormType) 
{ 
    foreach (Form OpenForm in System.Windows.Forms.Application.OpenForms) 
    { 
     if (OpenForm.GetType() == FormType) 
      return OpenForm; 
    } 

    return null; 
} 

И тогда, когда вы создаете свою дочернюю форму.

frmMyChildForm frmChild1; 

if ((frmChild1 = (frmMyChildForm)IsFormAlreadyOpen(typeof(frmMyChildForm))) == null) 
    { //Form isn't open so create one 
     frmChild1= new frmMyChildForm(); 

    } 
    else 
    { // Form is already open so bring it to the front 
     frmChild1.BringToFront(); 

    } 
-1

Вы можете использовать одноэлементный подход, и пусть форма имеет переменную-экземпляр-экземпляр, которая отслеживает, была ли она инициализирована или нет.

http://en.wikipedia.org/wiki/Singleton_pattern

+0

Как вы примените этот шаблон в коде C#/winform, чтобы удовлетворить требование автора? –

+0

Если это требование открывается только одним экземпляром в любое время и открыть новый, если никто не открыт, это будет работать очень хорошо - я действительно сделал это сам. – SilverSkin

0

Может быть что-то подобное может помочь вам

Form frmToCreate; 
String strClassName=typeof(FormToCreate).Name 
frmToCreate = GetForm(strClass); 
if(frmToCreate == null) 
{ 
    //create the form here 
} 
frmToCreate.MdiParent = this; //supposing you are inside of the mainwindow (MDI window) 
frmToCreate.Visible = true; 
//other code goes here 

где GetForm будет что-то вроде этого

public Form GetForm(String type) 
{ 
    int i; 
    Form[] children = this.MdiChildren; //or mdiwindow.MdiChildren 

    for (i = 0; i < children.Length; i++) 
    { 
     if (children[i].GetType().Name == type) 
     { 
      return children[i]; 
     } 
    } 
    return null; 
} 

Если это просто дело игры с MdiChildren собственности.