比方说,我这里有 2 个 WinForm,分别是 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;
}
在我看来,您正在尝试将 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 引用它。
如果您的意思是运行“仍在内存中”,那么您可以
只需测试对表单的引用:if(form1 != null)
之后,您可以测试是否被隐藏:if(form1.Visible)
并可能最小化:if(form1.WindowState != FormWindowState.Minimized)
如果您想检查您的表单是否已关闭(并因此被丢弃),您可以尝试从该表单调用一个方法并捕获ObjectDisposedException
.
try
{
Form1.SomeMethod();
}
catch (ObjectDisposedException ex)
{
// Form has been closed
}
如果表单尚未关闭,并且您想检查它是否可见,则可以使用它的“可见”属性
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;
}