2011-07-12 36 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); 
相關問題