我如何在MDI父表单下一次打开一个表单?

时间:2013-07-25 05:07:51

标签: c# winforms mdichild mdiparent

我有一份MDI表格。在此MDI中,有多个按钮可以打开新表单。让按钮为btn1btn2btn3btn4 ....当我按btn1时,form1会加载。当我按btn2时,form2正在加载...现在我按btn1,然后加载form1。如果我再次按btn1,则会打开另一个form1。如果我按form1 btn2,则form2同时打开。但我想一次打开一张表格。我怎么防止这个?

4 个答案:

答案 0 :(得分:1)

您可以阅读mutual exclusion http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx 这是一个通用解决方案,以确保您同时拥有一件事(线程,进程,表单,等等)。您甚至可以在应用程序之间使用它。 此处显示了一个示例:http://www.dotnetperls.com/mutex

您可以创建多个互斥锁,每个表单对应一个互斥锁。或者一组用于一组表格,在任何组合适合你。

示例场景:

  • Form1创建名为X
  • 的互斥锁
  • 正在加载Form2检查是否创建了互斥锁X,如果是,则自行关闭。

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

答案 1 :(得分:1)

您可以将flag用于此目的,好像这样:

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变量来计算打开的表单,如下所示:

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--;
}

答案 2 :(得分:1)

这是否意味着当您打开Form1时,您仍然希望能够打开Form2和3等? 你不想要它,你可以使用form1Instance.SHowDialog()而不是Show()... 但这通常意味着当form1打开时你无法访问父表单......

但King King的anwser对你来说可能更有用。

答案 3 :(得分: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();
  }