C# 如何在MDI父窗体下一次打开窗体?

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打开。但我想一次打开一张表格。如何防止这种情况发生?您可以阅读有关互斥的内容 这是一个通用解决方案,确保您在同一时间只拥有一件东西(线程、进程、形式等等)。您甚至可以在应

我有一张MDI表格。在此MDI中有多个按钮可打开新表单。Let按钮为
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随时