如何检查表单对象是否一直使用 C# 运行
本文关键字:运行 一直 是否 检查表 单对象 | 更新日期: 2023-09-27 18:36:20
假设,我这里有2个WinForms,分别是Form1和Form2。然后我隐藏了 Form1。我想知道如何在 Form2 中编写代码以检测 Form1 对象是否仍在运行。
我试图使用Form1.ActiveForm
但它似乎给了我 NULL 值。有什么更好的主意吗?谢谢。
您可以使用我的方法获取任何活动表单:
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;