Как избежать множественных дочерних форм, отображаемых в MDIParent C # Win Forms - PullRequest
8 голосов
/ 12 июля 2011

Я хочу, чтобы моя дочерняя форма не появлялась много раз, когда пользователь пытается открыть дочернюю форму, которая уже открыта в MDIParent. Один из способов избежать этого - отключить контроллер (в моем случае - КНОПКУ), но для этой функции я также дал ярлык ( Ctrl + L ). Поэтому, если пользователь вводит Ctrl + L , открывается та же самая дочерняя форма, и я вижу, что две дочерние формы находятся в MDI.

private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        frmWebLeads formWeblead = new frmWebLeads();
        formWeblead.MdiParent = this;
        formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        formWeblead.Show();

    }

Я хочу избежать этого. Как я могу это сделать? enter image description here

На изображении вы можете видеть, что дочерняя форма Имя Онлайн-ссылки открывается дважды, когда пользователь открывал первый раз с помощью Меню (LEADS) и второй раз с помощью сочетания клавиш. Я не хочу, чтобы это случилось. Если форма уже открыта, следует избегать открытия другой формы ... Как это сделать?

Ответы [ 15 ]

4 голосов
/ 10 ноября 2012

Установите это в своей функции main () формы

    InitializeComponent();
     this.WindowState = FormWindowState.Maximized;
     this.ShowInTaskbar = true;

 from_login login = new from_login();
                login.MdiParent=this;
                login.Show();
                pmsnrr.pmsmain = this;  

, и это код, который входит в событие гладкой полосы меню

if (this.ActiveMdiChild != null)
            this.ActiveMdiChild.Close();
            frm_companymaster company = new frm_companymaster();
            company.MdiParent = this;
            company.WindowState = FormWindowState.Normal;
            company.Show();
4 голосов
/ 12 июля 2011

То, как я обычно это делаю, если у меня только один открытый, выглядит примерно так:

//class member for the only formWeblead
frmWebLeads formWebLead = null;

private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (formWebLead == null)
    {
        formWeblead = new frmWebLeads();
        formWeblead.MdiParent = this;
    }

    formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
    formWeblead.Show();
}
3 голосов
/ 12 июля 2011
private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
{
    formWeblead formWeblead = null;
    if ((formWeblead = IsFormAlreadyOpen(typeof(frmWebLeads)) == null)
    {
        formWeblead = new frmWebLeads();
        formWeblead.MdiParent = this;
        formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        formWeblead.Show();
    }
}

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

   return null;
}
2 голосов
/ 05 августа 2014

Я лично предпочитаю общую реализацию:

private void ShowOrActivateForm<T>() where T : Form
        {
            var k = MdiChildren.Where(c => c.GetType() == typeof(T)).FirstOrDefault();
            if (k == null) 
            {                    

                k = (Form)Activator.CreateInstance(typeof(T));
                k.MdiParent = this;
                k.Show();
            }
            else
            {
                k.Activate();                
            }            
        }

Тогда вы можете просто использовать его так:

ShowOrActivateForm<myForm>();

Где myForm - это ТИП формы, которую вы хотите создать

1 голос
/ 04 мая 2016

Время кулаков при открытии формы из меню, переменная frmRep равна нулю

frmReportes frmRep = null

... поэтому я добавляю еще одно «если» внутри первого «если» для проверки моей формы, потому что у меня есть другие формы, тогда, если ее не видно, я делаю экземпляр и показываю форму, но если она видима Я просто использую Activate ()

    private void rToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (frmRep != null)
        {
            if (frmRep.Visible == false)
            {
                frmRep = new frmReportes();
                frmRep.MdiParent = this; frmRep.Show();
            }
            else
            {                    
                frmRep.Activate();
                return;
            }
        }
        else
        {
            frmRep = new frmReportes();
            frmRep.MdiParent = this; 
            frmRep.Show();
        }            
    }
1 голос
/ 22 февраля 2014
    frmWebLeads formWeblead;

    bool isformWebleadOpen =false;

    private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
    {
      if(isformWebleadOpen == false)
      {
       formWeblead = new frmWebLeads();
       isformWebleadOpen =true;
       formWeblead.Closed += formWeblead_Closed;
       formWeblead.Show();
      }
   }

   void formWeblead_Closed(object sender, EventArgs e)
   {
     isformWebleadOpen = false;
   }
0 голосов
/ 09 августа 2016

Простейшие способы предотвращения множественного экземпляра потомка:

 private void Showforms(Form frm)
 {
   if (this.ActiveMdiChild==null)
   {
      frm.MdiParent = this;               
      frm.Show();
   }
 }

Тогда назовите его так:

Form1 frm = new Form1();
Showforms(frm);
0 голосов
/ 09 августа 2016

простейшие способы предотвращения множественного экземпляра ребенка

private void Showforms(Form frm)
{
    if (this.ActiveMdiChild==null)
    {
        frm.MdiParent = this;
        frm.Show();
    }  
}
0 голосов
/ 20 декабря 2015
    private void mnuMyForm_Click(object sender, EventArgs e) // click to open MyForm
    {
        foreach (Form item in this.MdiChildren) // check all opened forms
        {
            if (item.Name == "MyFormName") // check by form name if it's opened
            {
                item.BringToFront(); // bring it front
                return; //exit
            }
        }

        // if MyForm is not opened
        // you know what it is
        MyForm frm = new MyForm();
        frm.MdiParent = this;
        frm.Show();
    }
0 голосов
/ 17 декабря 2015

Код, который запрещает использование той же дочерней формы в форме MDI

private void materialToolStripMenuItem_Click(object sender, EventArgs e)
{
  frmMaterial newMDIChild = new frmMaterial();
  bool opened = false;
  foreach (Form OpenForm in Application.OpenForms)
  {
    if (OpenForm.GetType() == typeof(frmMaterial))
    {
      OpenForm.Activate();//to bring the activated form to the front
      opened = true;
    }
  }
  if (opened==false)
  {
    // Set the Parent Form of the Child window.
    newMDIChild.MdiParent = this;
    //newMDIChild.WindowState = System.Windows.Forms.FormWindowState.Maximized;
    // Display the new form.
    newMDIChild.Show();
  }
}
...