winforms 查找C# Windows应用程序中打开的窗体

ws51t4hk  于 2023-03-31  发布在  C#
关注(0)|答案(6)|浏览(282)

我正在使用此函数关闭现有窗体并打开一个新窗体。
如果没有exixting形式,则抛出错误。
错误:
目标:System.Object MarshaledInvoke(System.Windows.Forms.Control,System.Delegate,System.Object[],Boolean)
消息:在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke。
堆栈:位于System.Windows.Forms.Control.MarshaledInvoke(控件调用方,委托方法,Object[]参数,布尔同步)
所以需要在关闭表单之前检查是否有任何打开的表单,以避免错误。如何?

static public void NewMainForm(Form main, bool ClosePreviousMain)
    {
            if (main != null)
            {
                Global.ActiveForm = main.Text;
                if (ClosePreviousMain & MyContext.curMain != null)
                {
                    MyContext.curMain.FormClosed -= new FormClosedEventHandler(main_FormClosed);
                    //Need to check for any form active and then close the form.
                    MyContext.curMain.Invoke(new Action(MyContext.curMain.Dispose));
                }
                MyContext.curMain = main;
                MyContext.curMain.FormClosed += new FormClosedEventHandler(main_FormClosed);
                MyContext.curMain.ShowDialog();
            }
    }
sq1bmfud

sq1bmfud2#

if (ApplicationFormStatus.CheckIfFormIsOpen("FormName")) 
{
// It means it exists, so close the form
}

 public bool CheckIfFormIsOpen(string formname)
        {

            //FormCollection fc = Application.OpenForms;
            //foreach (Form frm in fc)
            //{
            //    if (frm.Name == formname)
            //    {
            //        return true;
            //    }
            //}
            //return false;

            bool formOpen= Application.OpenForms.Cast<Form>().Any(form => form.Name == formname);

            return formOpen;
        }

我已经粘贴了两个方法,一个是简单的,第二个是LINQ。

vxqlmq5t

vxqlmq5t3#

如果你知道表单的名称,你也可以这样做:

var frm = Application.OpenForms.Cast<Form>().Where(x => x.Name == "MyForm").FirstOrDefault();
if (null != frm)
{
    frm.Close();
    frm = null;
}
i7uq4tfw

i7uq4tfw4#

这部分代码搜索窗体的现有示例,如果存在,则仅显示它,如果不存在,则创建它的示例

`foreach (Form form in Application.OpenForms)
        {
            if (form.GetType() == typeof(myMainform))
            {
                form.Activate();
                form.Show();
                this.Close();
                return;
            }
        }

        myMainform m = new myMainform();
        m.Show();`
dced5bon

dced5bon5#

我可能会迟到,但以防万一有人需要这个。
例如:

FormCollection fc = System.Windows.Forms.Application.OpenForms;

fc对象包含以下属性:Count和InnerList(非常有用)

希望它能有所帮助,即使是2021年,我认为有人会需要这些信息(我在搜索时没有在任何地方看到)

p4rjhz4m

p4rjhz4m6#

关闭窗体

var allForms = Application.OpenForms.Cast<Form>().ToList();
        for (int i = 0; i < allForms.Count; i++)
        {
            if (allForms[i].Text == "Form Name")
            {
                allForms[i].Close();
            }
        }

相关问题