Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find the open forms in c# windows application

I am using this function to close existing form and open a new form.

If there is no exixting form, it throws error.

Error :

Target : System.Object MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)

Message : Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

Stack : at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)

SO need to check for any form open before closing the form to avoid the error. How?

    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();
            }
    }
like image 480
Anuya Avatar asked Jul 10 '09 08:07

Anuya


2 Answers

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;
        }

I have pasted the two methods one simple one and the second one is the LINQ.

like image 90
Teju MB Avatar answered Sep 22 '22 16:09

Teju MB


You can use the Application.OpenForms collection.

like image 20
Julien Poulin Avatar answered Sep 22 '22 16:09

Julien Poulin