如何检查表单对象是否一直使用 C# 运行

本文关键字:运行 一直 是否 检查表 单对象 | 更新日期: 2023-09-27 18:36:20

假设,我这里有2个WinForms,分别是Form1和Form2。然后我隐藏了 Form1。我想知道如何在 Form2 中编写代码以检测 Form1 对象是否仍在运行。

我试图使用Form1.ActiveForm但它似乎给了我 NULL 值。有什么更好的主意吗?谢谢。

如何检查表单对象是否一直使用 C# 运行

您可以使用我的方法获取任何活动表单:

public static Form IsFormAlreadyOpen(Type FormType)
{
   foreach (Form OpenForm in Application.OpenForms)
   {
      if (OpenForm.GetType() == FormType)
         return OpenForm;
   }
   return null;
}

如果您的意思是运行"仍在内存中",那么您可以

  • 只需测试对表单的引用:if(form1 != null)

  • 之后,您可以测试是否隐藏:if(form1.Visible)

  • 并且可能最小化:if(form1.WindowState != FormWindowState.Minimized)

如果要

检查表单是否已关闭(并因此被释放),可以尝试从该表单调用方法并捕获ObjectDisposedException

try 
{ 
    Form1.SomeMethod();
} 
catch (ObjectDisposedException ex) 
{ 
    // Form has been closed
} 

如果表单尚未关闭,并且您想检查它是否可见,则可以使用它的"可见"属性

在我看来

,您正在尝试将 Form1 作为静态实例访问,除非您以这种方式创建了 Form1,否则您将无法访问它,这可能就是您从函数中获取 NULL 值的原因。如果要从 Form2 引用 Form1,则需要向其传递引用。

表格1:

public class Form1
{
   public Form1()
   {
   }    
}

表格2:

public class Form2
{
   private Form1 _frm1;
   public Form2(Form1 frm1)
   {
       _frm1 = frm1;
   }
}

现在,当您创建 Form2 的实例时,您可以像

...
Form2 frm2 = new Form2(frm1);

其中 frm1 是 Form1 的实例。

现在,每当您需要从 Form2 引用 Form1 时,都可以通过 _frm1 引用它。

private Form GetForm()
        {
            Form mdiParent = this.MdiParent;
            Form1 objForm
            foreach (Form frm in mdiParent.MdiChildren)
            {
                objForm = frm as Form1;
                if (objForm != null)
                {
                   objForm.Activate();
                   return objForm;
                }
            }
            return null;
        }

你可以用一行字检查:

bool form1Exists = Application.OpenForms.OfType<Form1>().Any();

或使用通用方法:

private bool FormExists<T>() where T : Form
{
    return Application.OpenForms.OfType<T>().Any();
}

要使用:

bool form1Exists = FormExists<Form1>();

请注意,Application.OpenForms属性获取应用程序拥有的打开窗体的集合,无论它们是显示还是隐藏。并且不要忘记添加以下using以使用 OfType<T> 方法:

using System.Linq;