2013-06-20 64 views
0

我使用.NET 3.5与c#winforms。在这我使用MDI子选项卡控件。它工作正常,如果我打开一个窗体,它会打开成功。如果我再次打开相同的表单,它会打开。这意味着标签的重复。如何避免子MDI选项卡控件中的重复选项卡

我的代码是像下面...

private void Main_MdiChildActivate(object sender, EventArgs e) 
     { 
      if (this.ActiveMdiChild == null) 
       tabForms.Visible = false; // If no any child form, hide tabControl 
      else 
      { 
       this.ActiveMdiChild.WindowState = FormWindowState.Maximized; // Child form always maximized 

       if (this.ActiveMdiChild.Tag == null) 
       { 
        TabPage tp = new TabPage(this.ActiveMdiChild.Text); 
        tp.Tag = this.ActiveMdiChild; 
        tp.Parent = tabForms; 
        tabForms.SelectedTab = tp; 

        this.ActiveMdiChild.Tag = tp; 
        this.ActiveMdiChild.FormClosed += new FormClosedEventHandler(ActiveMdiChild_FormClosed); 
       } 

       if (!tabForms.Visible) tabForms.Visible = true; 
      } 
     } 
在此

,每次this.ActiveMdiChild.Tag取空的值,使之一次又一次打开了新的形式。这意味着选项卡控件中的表单重复

+0

选项卡式窗口模式进行比较,以MDI如水比较火。使用一个或另一个,而不是两个。 –

回答

0

添加上述方法以检查名称是否为mdi父级中的子级别。

public static bool FormExist(string formName, out Form frm) 
    { 
     frm = null; 
     bool exist = false; 

     Form[] f = yourMdiParent.ActiveForm.MdiChildren; 
     foreach (Form ff in f) 
     { 
      if (ff.Name == formName) 
      { 
       frm = ff; 
       exist = true; 
       break; 
      } 
     } 

     return exist; 
    } 

并添加添加子窗体的检查。

Form forma; 
    if(FormExist("yourchildformid",out forma) && forma !=null) 
    { 
     forma.Focus(); 
     return; 
    } 
+0

我不确定这个方法可以是静态的,因为你需要访问一个实例变量?另外,为什么不返回Form,然后如果找不到或返回null,或者找到实际的Form。 –

+0

在我使用它的课堂上,我只是静态的。你可以改变它。如果返回null,则初始化它并将其添加到mdi父项。这段代码在我的erp中正常工作多年。 :) –

0

,我迟到了,但我用:

private void serviceManagerToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     // prevent duplicates 
     if (Application.OpenForms.OfType<ServiceManager>().FirstOrDefault() != null) 
     { 
      return; 
     } 
     ServiceManager serviceManager = new ServiceManager { MdiParent = this, WindowState = FormWindowState.Maximized }; 
     serviceManager.Show(); 
    } 
相关问题