C# 如何在MDI父窗体下一次打开窗体?
我有一张MDI表格。在此MDI中有多个按钮可打开新表单。Let按钮为C# 如何在MDI父窗体下一次打开窗体?,c#,winforms,mdichild,mdiparent,C#,Winforms,Mdichild,Mdiparent,我有一张MDI表格。在此MDI中有多个按钮可打开新表单。Let按钮为btn1,btn2,btn3,btn4。。。。当我按下btn1时,form1被加载。当我按下btn2时,form2正在加载。。。现在我按下btn1,加载form1。如果我再次按下btn1,则另一个form1打开。同时让form1打开,如果我按btn2,form2打开。但我想一次打开一张表格。如何防止这种情况发生?您可以阅读有关互斥的内容 这是一个通用解决方案,确保您在同一时间只拥有一件东西(线程、进程、形式等等)。您甚至可以在应
btn1
,btn2
,btn3
,btn4
。。。。当我按下btn1
时,form1
被加载。当我按下btn2
时,form2
正在加载。。。现在我按下btn1
,加载form1
。如果我再次按下btn1
,则另一个form1
打开。同时让form1
打开,如果我按btn2
,form2
打开。但我想一次打开一张表格。如何防止这种情况发生?您可以阅读有关互斥的内容
这是一个通用解决方案,确保您在同一时间只拥有一件东西(线程、进程、形式等等)。您甚至可以在应用程序之间使用它。
此处显示了一个示例:
您可以创建多个互斥体,每个窗体一个互斥体。或者一个代表一组形式,以任何适合你的组合
示例场景:
- Form1创建一个名为X的互斥体
- 正在加载的Form2检查是否创建了互斥锁,如果创建了互斥锁,它会自动关闭
当然,当创建者(本例中的Form1)关闭时,您需要确保互斥锁已被释放,以允许其他窗体显示。您可以阅读有关互斥的内容 这是一个通用解决方案,确保您在同一时间只拥有一件东西(线程、进程、形式等等)。您甚至可以在应用程序之间使用它。 此处显示了一个示例: 您可以创建多个互斥体,每个窗体一个互斥体。或者一个代表一组形式,以任何适合你的组合 示例场景:
- Form1创建一个名为X的互斥体
- 正在加载的Form2检查是否创建了互斥锁,如果创建了互斥锁,它会自动关闭
当然,您需要确保当创建者(本例中的Form1)关闭时,互斥锁已被释放,以允许其他窗体显示。为此,您可以使用一些
标志
,确定如下:
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 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--;
}
至少这是一个有效的简单解决方案
一般情况下,您需要一个int
变量来计算打开的表单,如下所示:
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 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--;
}
int openedForms=0;
//假设一次最多打开3个表单。
私有无效按钮\u单击(对象发送者,事件参数e){
如果(openedForms<3){
//出示你的表格
//..............
openedForms++;
}
}
私有作废表单已关闭(对象发送方,FormClosedEventArgs e){
开放格式--;
}
为此,您可以使用一些标志
,好的,如下所示:
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 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--;
}
至少这是一个有效的简单解决方案
一般情况下,您需要一个int
变量来计算打开的表单,如下所示:
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 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--;
}
int openedForms=0;
//假设一次最多打开3个表单。
私有无效按钮\u单击(对象发送者,事件参数e){
如果(openedForms<3){
//出示你的表格
//..............
openedForms++;
}
}
私有作废表单已关闭(对象发送方,FormClosedEventArgs e){
开放格式--;
}
这是否意味着当您打开Form1时,您仍然希望能够打开Form2和Form3等?
如果不需要,可以使用form1Instance.SHowDialog()而不是Show()。。。
但这通常意味着您无法在form1打开时访问父窗体
但是King's anwser可能对您更有用。这是否意味着当您打开Form1时,您仍然希望能够打开Form2和Form3等? 如果不需要,可以使用form1Instance.SHowDialog()而不是Show()。。。 但这通常意味着您无法在form1打开时访问父窗体
但是King's 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();
}
您得到的所有答案都很好,因此我不打算重复,只需给您一个示例,说明您可以使用哪些成员和方法来防止这种情况发生:
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();
}
你是说应该只有一个form1的实例,一个form2的实例,依此类推????你的意思是应该只有一个form1实例和一个form2实例,依此类推你的代码正在运行。但有一个问题。我使用btn1打开form1。当我关闭并重新打开它时,它不会打开。。。。所以请帮忙me@AnimeshGhosh您必须向所有子表单(包括
form1
)的事件FormClosed
注册formsClosed
处理程序。类似这样的form1.FormClosed+=formsClosed代码>::您的代码正在工作。但有一个问题。我使用btn1打开form1。当我关闭并重新打开它时,它不会打开。。。。所以请帮忙me@AnimeshGhosh您必须向所有子表单(包括form1
)的事件FormClosed
注册formsClosed
处理程序。类似这样的form1.FormClosed+=formsClosed代码>@AnimeshGhoshanytime@AnimeshGhosh随时