2013-07-25 55 views
1

我有一个MDI表单。在这个MDI中有多个按钮来打开新的表单。让按钮是btn1,btn2,btn3,btn4 ....当我按btn1,form1加载。当我按btn2,form2加载时...现在我按btn1,并加载了form1。如果我再次按下btn1,则另一个form1已打开。同时让form1是开放的,如果我按btn2form2是开放的。但是我想一次打开一个表格。我如何防止这种情况?如何在MDI父窗体下一次打开表单?

+0

您的意思是否有应该只是form1的一个实例,form2的一个实例,等等。 –

回答

1

你得到的答案是好,所以我不打算赘述,只是给你的成员和方法,你可以用它来防止这种情况发生的例子:

private Form frm; 

    private void button1_Clicked(object sender, EventArgs e) 
    { 
    if (frm != null) 
    { 
     frm.Close(); 
     frm.Dispose(); 
    } 

    frm = new Form1(); 
    frm.Show(); 
    } 

    private void button2_Clicked(object sender, EventArgs e) 
    { 
    if (frm != null) 
    { 
     frm.Close(); 
     frm.Dispose(); 
    } 

    frm = new Form2(); 
    frm.Show(); 
    } 
+0

thanks @No Idea For Name –

+0

@AnimeshGhosh anytime –

1

您可以阅读上涨约mutual exclusionhttp://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx 它的东西在同一时间通用的解决方案,以确保你只有一样东西(线程,进程,形式,等等)。你甚至可以在应用程序间使用它。 此处显示了一个示例:http://www.dotnetperls.com/mutex

您可以创建多个互斥锁,每个窗体一个。或者是一套适合你的组合形式。

示例方案:

  • Form1中创建具有名称X
  • 窗体2互斥被装载检查互斥X是否被建立,如果是的话它关闭自身。

当然,当创建者(本例中的Form1)关闭时,您需要确保互斥体为Disposed /允许其他表单显示。

1

你可以使用一些flag为此,OK,像这样:

bool formOpened; 
private void buttons_Click(object sender, EventArgs e){ 
    if(!formOpened){ 
    //Show your form 
    //.............. 
    formOpened = true; 
    } 
} 
//This is the FormClosed event handler used for all your child forms 
private void formsClosed(object sender, FormClosedEventArgs e){ 
    formOpened = false; 
} 

至少这是一个简单的解决方案,它的工作原理。

在一般的情况下,你需要一个int变量来计算打开的形式,这样的:当你有Form1的开放

int openedForms = 0; 
//suppose we allow maximum 3 forms opened at a time. 
private void buttons_Click(object sender, EventArgs e){ 
    if(openedForms < 3){ 
    //Show your form 
    //.............. 
    openedForms++; 
    } 
} 
private void formsClosed(object sender, FormClosedEventArgs e){ 
    openedForms--; 
} 
+0

::你的代码正在工作。但有一个问题。我使用btn1打开form1。当我关闭它,然后重新打开它然后它不会打开....所以请帮助我 –

+0

@AnimeshGhosh你必须注册formClosed'处理器的事件FormClosed所有的孩子形式,包括'form1'。像这样的'form1。FormClosed + = formsClosed;' –

1

这是否意味着,你希望仍然能够打开窗体2和3等等?您可以使用form1Instance.SHowDialog()而不是Show()... 但是,这通常意味着您无法在form1打开时访问父窗体...

但国王的亲戚可能更适合你。

相关问题