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();
}
}
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.
You can use the Application.OpenForms collection.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With