我有一个 MDI 表格。在这个 MDI 中有多个按钮可以打开新表单。让按钮是btn1
, btn2
, btn3
, btn4
.... 当我按下btn1
,form1
是加载。当我按下btn2
,form2
加载... 现在我按下btn1
,form1
加载。如果我再次按下,btn1
则另一个form1
是打开的。同时 letform1
是打开的,如果我按下btn2
form2
是打开的。但我想一次打开一个表格。我如何防止这种情况?
4 回答
您可以阅读有关mutual exclusion
http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx
这是确保您只有一件事(线程、进程、表单等)的通用解决方案同时的东西。您甚至可以在应用程序间使用它。此处显示了一个示例:http: //www.dotnetperls.com/mutex
您可以创建多个互斥锁,每个表单一个。或者一个用于一组表格,以适合您的任何组合。
示例场景:
- Form1 创建一个名为 X 的互斥锁
- 正在加载 Form2 检查是否创建了互斥体 X,如果是,它会自行关闭。
当然,您需要确保在Disposed
创建者(本例中为 Form1)关闭时/释放互斥锁,以允许显示其他表单。
您可以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--;
}
这是否意味着当您打开 Form1 时,您仍然希望能够打开 Form2 和 3 等?如果您不希望这样,您可以使用 form1Instance.SHowDialog() 而不是 Show()... 但这通常意味着您在 form1 打开时无法访问父表单...
但是 King King 的 anwser 可能对您更有用。
你得到的所有答案都很好,所以我不会重复它们,只是给你一个成员和方法的例子,你可以用来防止这种情况发生:
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();
}