C# 如何检查是否已启动非模式对话框

C# 如何检查是否已启动非模式对话框,c#,.net,winforms,.net-3.5,non-modal,C#,.net,Winforms,.net 3.5,Non Modal,我的应用程序在单击按钮时启动一个非模式对话框。如果用户再次单击该按钮,我想检查该表单是否已在运行,是否可能?您可以使用 if(Application.OpenForms.OfType().Any()) //一个已经打开了 如果要关闭此表单: var form = Application.OpenForms.OfType<YourNonModalFormType>().FirstOrDefault(); if (form != null) { // launched

我的应用程序在单击按钮时启动一个非模式对话框。如果用户再次单击该按钮,我想检查该表单是否已在运行,是否可能?

您可以使用

if(Application.OpenForms.OfType().Any())
//一个已经打开了
如果要关闭此表单:

var form = Application.OpenForms.OfType<YourNonModalFormType>().FirstOrDefault();
if (form != null)
{
    // launched
    form.Close();
}
var form=Application.OpenForms.OfType().FirstOrDefault();
if(form!=null)
{
//发射
form.Close();
}

另一种方法是手动声明变量以跟踪表单实例:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private Form2 f2 = null;

    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 == null || f2.IsDisposed)
        {
            f2 = new Form2();
            f2.Show();
        }
        else
        {
            f2.Close();
        }
    }

}

谢谢如果它已经启动了,我可以通过这种方式关闭它吗?实际上我正在使用.NET3.5。似乎它不能在我的代码中使用。还有其他方法吗?我想我可以在Application.OpenForms集合中循环,并将其类型与我的非模态表单类型进行比较。您是否缺少使用System.Linq的
?@PaulSnow是的,对不起,我很忙。是的,sgmoore是对的-LINQ是从.NET3.5开始提供的
public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private Form2 f2 = null;

    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 == null || f2.IsDisposed)
        {
            f2 = new Form2();
            f2.Show();
        }
        else
        {
            f2.Close();
        }
    }

}