我有一个子窗体,其中部分代码如下所示:
this.Close();
然后在代码的另一部分中,我寻找所有打开的子窗体以下列方式关闭它们:
foreach (Form formChildOpen in this.MdiChildren)
{
if (!formChildOpen.Name.Equals("Sell"))
{
formChildOpen.Close();
}
}
但是在调试时,在搜索打开的表单时会出现我之前关闭的表单。
我需要确定表单是否已关闭以打开它,伪代码将如下所示:
foreach (Form formChildOpen in this.MdiChildren)
{
if (!formChildOpen.Name.Equals("Sell"))
{
formChildOpen.Close();
}
else
{
formChildOpen.Show();
}
}
显然,它不能正常工作,因为在代码的其他部分,名为“ Sell”的表格没有关闭,并且在执行上述代码时,已打开的表格又打开了另一张表格。
欢迎提出任何想法或建议。
答案 0 :(得分:0)
使用这些哈希集以及显示和关闭的事件,您可以跟踪哪个
窗体已打开,哪个人已关闭
private readonly HashSet<Form> _closedForms = new HashSet<Form>();
private readonly HashSet<Form> _openForms = new HashSet<Form>();
private void FormOnClosed(object sender, EventArgs e)
{
_openForms.Remove((Form) sender);
_closedForms.Add((Form) sender);
}
public void FormOnShown(object sender, EventArgs e)
{
_closedForms.Remove((Form)sender);
_openForms.Add((Form)sender);
}
但是对于foreach表单,您必须为这些事件处理程序分配
form1.Closed += FormOnClosed;
form1.Shown += FormOnShown;
答案 1 :(得分:0)
我们正在寻找名为Sell的表单的最佳实例来显示(如果已经可见,则使用该表单):
Form frmSell = null;
foreach (Form formChildOpen in this.MdiChildren)
{
if (!formChildOpen.Name.Equals("Sell"))
{
formChildOpen.Close();
}
else
{
if (formChildOpen.Visible || frmSell == null)
frmSell = formChildOpen;
}
}
if (frmSell != null)
frmSell.Show();
// else
// consider creating a new instance of form Sell here