2011-07-12 39 views
8

我想避开我的孩子从形式出现很多次,当用户试图打开子窗体这已经是开放的MdiParent。避免这种情况的一种方法是通过禁用控制器(在我的情况下按钮),但我已经给此功能的快捷键(Ctrl键+大号)为好。因此,如果用户键入按Ctrl +大号,同一子窗体打开,我可以看到两个子窗体在MDI。中的MdiParent C#赢出如何避免多个子窗体形式

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

在图像,你可以看到一个子窗体名称在线信息作为用户使用菜单(线索)开第一次打开两次,并通过快捷键第二次。我不希望发生这种情况。如果表格已经打开,它应该避免打开另一个相同的表格...如何做到这一点?

回答

4

的方式,我通常做,如果我只应该有一个开放的是一样的东西:

//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(); 
} 
0

最简单的方法就是保持到子窗体的引用,只生成一个新的,如果它不存在。事情是这样的:

class ParentForm : Form { 
    frmWebLeads formWeblead = null; 

    //... 

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

    } 

} 

您还需要编写代码来设置formWeblead当您关闭它为空,但我敢肯定,你可以计算的那部分:)

+0

@迈克卡隆感谢您的代码。你留给我的最后一部分造成了一些混淆,有疑问,声明的形式weblead我MDIParent和我想设置formWeblead =空使用frmWebLoad离开事件使用儿童父母访问,这是好的! ???或者有没有最好的方法 – panindra

+1

我不认为我会使用离开事件,因为这是一个重点。相反,使用子窗体的Closing事件,当您关闭它时触发。 –

+0

@Mike对于调用click事件的菜单项留下一些TODO;我喜欢禁用创建表单的菜单项,以避免与用户混淆。 “我点击”打开“,什么也没有发生”。 – gangelo

3
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; 
} 
+0

对不起,但我没有同样的问题。我在跑 。.NET 3.5在VS 2008上。我可以关闭并重复打开一个表单。 – Joe

+0

我正在使用.net 3.5和VS 2010 Ultimate,Windows XP ..这个cousing error – panindra

0
// Implementation of the below class in your MDI Parent 
private void openToolStripMenuItem_Click(object sender, EventArgs e) { 
      if (SingletonForm.Exists) { 
       return; 
      } else { 
       m_openToolStripMenuItem.Enabled = false; 

       SingletonForm form = new SingletonForm(); 
       form.FormClosed += new FormClosedEventHandler(
        delegate(object _sender, FormClosedEventArgs _e) { 
         m_openToolStripMenuItem.Enabled = true; 
        }); 
       form.MdiParent = this;    
       form.Show(); 
      } 
     } 


// SingletonForm Class 
    using ... 
    using System.Threading; 

    namespace SingletonForm { 

     public partial class SingletonForm : Form, IDisposable { 
      static private readonly string m_mutexName = "SingletonForm.SingletonForm"; 
      private Mutex m_mutex; 
      private bool m_disposed; 

      public SingletonForm() { 
       m_disposed = false; 

       // Check to see if there is already a running instance... 
       bool owned; 
       m_mutex = new Mutex(true, m_mutexName, out owned); 
       if (!owned) { 
        // Already running, get out... 
        Close(); 
        return; 
       } 

       InitializeComponent(); 
      } 

      ~SingletonForm() { 
       Dispose(false); 
      } 

      static public bool Exists { 
       get { 
        bool owned; 
        using (new Mutex(false, m_mutexName, out owned)) { 
         return !owned; 
        } 
       } 
      } 

      // IDisposable Members 
      // -------------------------------------------------------------------------- 
      #region IDisposable Members 
      new public void Dispose() { 
       Dispose(true); 

       // Use SupressFinalize in case a subclass of this type implements a finalizer. 
       GC.SuppressFinalize(this); 
      } 
      #endregion // IDisposable Members 

      /// <summary> 
      /// Note: Comment out the Dispose(bool disposing) implementation in your 
      /// SingletonForm.Designer.cs 
      /// </summary> 
      /// <param name="disposing">true if we are disposing.</param> 
      protected override void Dispose(bool disposing) { 
       if (disposing && (components != null)) { 
        components.Dispose(); 
       } 

       base.Dispose(disposing); 

       // If you need thread safety, use a lock around these 
       // operations, as well as in your methods that use the resource. 
       if (!m_disposed) { 
        if (disposing) { 
         // Code to dispose the managed resources held by the class here... 
         if (m_mutex != null) { 
          m_mutex.Dispose(); 
          m_mutex = null; 
         } 
        } 

        // Indicate that the instance has been disposed. 
        m_disposed = true; 
       } 
      } 
     }; 
    }; 

本来为了允许1-n个实例存在,而不是使用信号量。

0

这里是“方法”,我为调用open只有一种形式当U中的MdiParent点击菜单创建。希望这个“方法”能帮助你!

用法:On Even ToolStripMenuItems。

Form1 frm1 = new Form1(); 
CheckActiveChildForm(frm1,"myForm"); 

//myForm is the Text of Form1 
private void CheckActiveChildForm(Form FormControl, string FormExists) 
{ 
    int h = 0; 
    if (MdiChildren.Count() == 0) 
    { 
     //Form2 childF = new Form2(); 
     FormControl.MdiParent = this; 
     FormControl.Show(); 
    } 

    if (MdiChildren.Count() > 0) 
    { 
     for (int i = 0; i < MdiChildren.Count(); i++) 
     { 
      if (MdiChildren.ElementAt(i).Text == FormExists) 
      { 
       h = 1; 
      } 
     } 
    } 

    if (h == 0) 
    { 
     FormControl.MdiParent = this; 
     FormControl.Show(); 
    } 
} 
+0

为什么downvote? –

4

设置此表单中的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(); 
0

你可以查看当前打开的窗体里面的云实现:

if (Application.OpenForms.Count == 1) { 
    ReportProductDetails Report9 = new ReportProductDetails(); 
    Report9.MdiParent = this; 
    Report9.Show(); 
    Report9.Activate(); 
} 
else { 
    MessageBox.Show("Sorry!Close the All the Exist Form,Before open this Form", "Information", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 
0

我用这个解决方案,用一个小窍门

frmWebLeads formWebLead = null; 

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

     formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized; 
     formWeblead.Show(); 
    } 
1
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; 
    } 
2

我个人更喜欢一个通用的实现:

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是您要创建的表单的类型

+0

我喜欢这种方法。它比为每个孩子创建空白字段更具可扩展性。 +1为泛型。我很想知道是否有任何使用反射的额外开销。尽管处于非常高的水平。 – Apache

+1

我想象任何额外的开销都可以忽略不计。它只在您尝试打开表单时才会运行,因此除非您一次打开大量表单,否则无法想象这会对您的应用程序性能或用户体验产生任何影响。 –

+0

这很好。我想在一个可扩展的应用程序中,无论如何,您都会使用您的IoC容器,而不是依赖“Activator”。我现在使用RadDock的这种方法来跟踪MDI Children和Tool Windows。我将'Show()'和'Activate()'取出,并返回原始格式为'T',以便可以在需要时停靠。 – Apache

0

当您打开从菜单的形式,防止在同一子窗体在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(); 
    } 
} 
0
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(); 
    } 
1

拳头时间的代码中,变量frmRep为空

frmReportes frmRep = null 

...等等我在第一个“if”中添加另一个“if”来验证我的表单是可见的,因为我有另一个表单,那么如果它不可见,我将创建一个实例并显示表单,但是如果可见,我只需使用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(); 
     }    
    } 
0

预防儿童的多个实例的simpleist方式

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

孩子的预防多个实例的最简单的方法:

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

然后调用它像这样:

Form1 frm = new Form1(); 
Showforms(frm); 
相关问题