Найти открытые формы в приложении c # windows - PullRequest
8 голосов
/ 10 июля 2009

Я использую эту функцию, чтобы закрыть существующую форму и открыть новую форму.

Если не существует формы для приписывания, выдается ошибка.

Ошибка:

Цель: System.Object MarshaledInvoke (System.Windows.Forms.Control, System.Delegate, System.Object [], Boolean)

Сообщение: Invoke или BeginInvoke не могут быть вызваны для элемента управления, пока не будет создан дескриптор окна.

Стек: в System.Windows.Forms.Control.MarshaledInvoke (вызывающий элемент управления, метод Delegate, аргументы 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();
            }
    }

Ответы [ 4 ]

22 голосов
/ 10 июля 2009

Вы можете использовать коллекцию Application.OpenForms .

7 голосов
/ 19 января 2014
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.

3 голосов
/ 16 декабря 2014

Если вы знаете название формы, вы можете сделать следующее:

var frm = Application.OpenForms.Cast<Form>().Where(x => x.Name == "MyForm").FirstOrDefault();
if (null != frm)
{
    frm.Close();
    frm = null;
}
2 голосов
/ 16 сентября 2016

эта часть кода ищет существующий экземпляр формы если существует, просто показывает его, а если нет, создает его экземпляр

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

        myMainform m = new myMainform();
        m.Show();`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...