1

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

4

4 回答 4

1

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

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

示例场景:

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

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

于 2013-07-25T05:15:28.150 回答
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变量来计算打开的表单,如下所示:

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--;
}
于 2013-07-25T05:20:53.773 回答
1

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

但是 King King 的 anwser 可能对您更有用。

于 2013-07-25T06:05:34.997 回答
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();
  }
于 2013-07-25T07:01:03.770 回答