我有一份MDI表格。在此MDI中,有多个按钮可以打开新表单。让按钮为btn1
,btn2
,btn3
,btn4
....当我按btn1
时,form1
会加载。当我按btn2
时,form2
正在加载...现在我按btn1
,然后加载form1
。如果我再次按btn1
,则会打开另一个form1
。如果我按form1
btn2
,则form2
同时打开。但我想一次打开一张表格。我怎么防止这个?
答案 0 :(得分:1)
您可以阅读mutual exclusion
http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx
这是一个通用解决方案,以确保您同时拥有一件事(线程,进程,表单,等等)。您甚至可以在应用程序之间使用它。
此处显示了一个示例:http://www.dotnetperls.com/mutex
您可以创建多个互斥锁,每个表单对应一个互斥锁。或者一组用于一组表格,在任何组合适合你。
示例场景:
当然,当创建者(本例中的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();
}