首页 > 解决方案 > 如何检查动态创建的winform实例是否已经在c#中打开

问题描述

我知道如何检查表格是否已经打开。但是,如果表单是动态创建的,我很难找到相同的。如何找到动态对象的类型?在下面的代码中,我试图找出 Application.OpenForms.OfType< ???>().Any() 中的内容。我确信这很愚蠢,但我无法破解它。

public static bool OpenForm(string formName)
{
    try
    {
        string namespace = MethodInfo.GetCurrentMethod().ReflectedType.Namespace;
        Assembly assembly = Assembly.GetExecutingAssembly();
        var _form = assembly.CreateInstance($"{namespace}.{formName}") as Form;

        if (Application.OpenForms.OfType<???>().Any())
        {
            //Form is already open, do nothing
            return true;
        }            

        if (_form != null)
            _form.Show();

        return true;
    }
    catch (Exception ex)
    {
        return false;
    }            
}

标签: c#winformstypes

解决方案


如果您打算使用泛型方法来验证 Form 类型的实例是否存在,如果不存在,则运行它,您可以使用泛型方法并执行检查和创建实例:

检查该类型的实例是否存在:

Application.OpenForms.OfType<T>() 

如果尚未创建该类型,则创建实例并显示表单:

public static bool OpenForm<T>() where T : Form, new()
{
    if (Application.OpenForms.OfType<T>().Any()) return true;

    try {
        var f = new T();
        f.Show();
        return true;
    }
    catch (Exception) {
        return false;
    }
}

由于您在代码片段中传递了 Form 的名称,因此您可以改为检查具有该名称的 Form 实例是否已经存在:

  Application.OpenForms.OfType<Form>().Any(f => f.Name.Equals(formName))
  • 如果没有,首先检查程序集是否实际上包含具有该名称的类型(如果找不到匹配项,则传递true, 导致抛出,因此它转到相同的异常处理程序):GetType()

    var formType = assembly.GetType(formAsmName, true);
    

否则,它将继续并创建实例。
下次您尝试使用该名称创建 Form 的实例时,第一次检查将返回true并且不会创建新实例。


public static bool OpenForm(string formName)
{
    if (Application.OpenForms.OfType<Form>().Any(f => f.Name.Equals(formName))) return true;

    try {
        var assembly = Assembly.GetExecutingAssembly();
        var formAsmName = $"{assembly.GetName().Name}.{formName}";
        var formType = assembly.GetType(formAsmName, true); // <- Throws

        var form = assembly.CreateInstance(formType.FullName) as Form;
        form.Show();
        return true;
    }
    catch (Exception) {
        // Throw a specific exception instead?
        return false;
    }
}

推荐阅读