如何检查窗体是否已打开,如果是,则将其关闭?

Dat*_*ase 74 c# winforms

我有一个表单"fm",这是一个简单的信息窗口,每隔10分钟(fm.Show();)打开一次.

我如何能够每隔10分钟检查一下"fm"形式是否打开,如果它打开则将其关闭并再次打开!

现在表单fm总是被创建,form fm = new form();
所以当我尝试检查表单是否打开时,它将始终为false并打开一个新窗口,即使之前有一个表单!

我需要一个工具给它一个唯一的身份,然后检查这个具有唯一身份的表单是否被打开!

我不想只更新表单上的数据(fm),因为我有一个复杂的按钮信息.

表格名称是 "UpdateWindow"

解决使用以下内容:

__PRE__

Sas*_*cha 85

也许这有助于:

FormCollection fc = Application.OpenForms;

foreach (Form frm in fc)
{
//iterate through
     if (frm.Name == "YourFormName")
     {
         bFormNameOpen = true;
     }
}
Run Code Online (Sandbox Code Playgroud)

foreach中的一些代码可以检测特定的形式,并且可以完成.虽然未经测试.

http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms上找到

  • 我用这个来解决.... Form fc = Application.OpenForms ["UpdateWindow"]; if(fc!= null)fc.Close(); fm.Show(); (10认同)

小智 39

我知道我迟到了......但是对于那些好奇的人......这是另一种方式

if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1)
    Application.OpenForms.OfType<UpdateWindow>().First().Close();

UpdateWindow frm = new UpdateWindow()
frm.Show();
Run Code Online (Sandbox Code Playgroud)


Pra*_* VR 14

假设我们从菜单单击MDI表单调用表单,那么我们需要在顶层创建该表单的实例声明,如下所示:

Form1 fm = null;
Run Code Online (Sandbox Code Playgroud)

然后我们需要定义菜单点击事件来调用Form1,如下所示:

private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (fm == null|| fm.Text=="")
    {
        fm = new Form1();              
        fm.MdiParent = this;
        fm.Dock = DockStyle.Fill;
        fm.Show();
    }
    else if (CheckOpened(fm.Text))
    {
        fm.WindowState = FormWindowState.Normal;
        fm.Dock = DockStyle.Fill;
        fm.Show();
        fm.Focus();               
    }                   
}
Run Code Online (Sandbox Code Playgroud)

定义检查Form1 的CheckOpened是否已打开:

private bool CheckOpened(string name)
{
    FormCollection fc = Application.OpenForms;

    foreach (Form frm in fc)
    {
        if (frm.Text == name)
        {
            return true; 
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

希望这将解决创建表单的多个实例的问题,如果已经打开或最小化,也可以在菜单上单击Form1.


def*_*ale 10

我不确定我理解这个陈述.希望这可以帮助.如果您只想使用此表单的一个实例进行操作,则应阻止关闭用户的Form.Dispose调用.为此,您可以处理子表单的Closing事件.

private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
    this.Hide();
    e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

然后你不需要创建新的实例frm.只需在实例上调用Show方法即可.

您可以检查Form.Visible属性以检查表单目前是否打开.

private ChildForm form = new ChildForm();

private void ReopenChildForm()
{
    if(form.Visible)
    {
        form.Hide();
    }
    //Update form information
    form.Show();
}
Run Code Online (Sandbox Code Playgroud)

实际上,我仍然不明白你为什么不只是更新表格上的数据.


小智 6

Form fc = Application.OpenForms["UpdateWindow"]; 

if (fc != null) 
   fc.Close(); 

fc.Show();
Run Code Online (Sandbox Code Playgroud)