Jankhana
Jankhana

Reputation: 963

"Value Dispose() cannot be called while doing CreateHandle()" when calling Dispose() or Close() on Winform

I'm having 2 forms. From one form, I created and shown the other form. It's working great. But when I try to close or dispose a form from the form that created it, I get following exception:

Exception :
   Value Dispose() cannot be called while doing CreateHandle().

Stack Trace :
========================
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.Label.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.Windows.Forms.Form.Dispose(Boolean disposing)
   at Speedometer_Application.frmSpeedometer.Dispose(Boolean disposing) 

The code is as follows:

if (frmMain.objfrm == null)
{   
     frmMain.objfrm = frmMyForm.Instance;     
     frmMain.objfrm.ShowInTaskbar = false;    
}
frmMain.objfrm.Show();
frmMain.objfrm.BringToFront();

frmMain is the Main Form that has a static variable of the frmMyForm. Then in my code, where-ever I want to use this, I just check if it's not null, then create it using a static Instance and then give the property.

While closing the form, I have the following code:

frmMain.objfrm.Close_this();

The Close_this calls the Close() or Dispose() method.

But when I call that function, I get the above exception.

Any idea?

Upvotes: 6

Views: 14631

Answers (3)

Samy S.Rathore
Samy S.Rathore

Reputation: 1823

The error Value Close() cannot be called while doing CreateHandle() usually happens when we try to close the form in the constructor or Load event.

For example, the following code gives the error:

private void frmCustomer_Load(object sender, EventArgs e)
{
 if (!Valid())
  this.Close;
}

The Solution:

private void frmCustomer_Load(object sender, EventArgs e)
{
 if (!Valid())
  this.BeginInvoke(new MethodInvoker(Close));
} 

You can use this in your code.

Upvotes: 22

Marcos Meli
Marcos Meli

Reputation: 3506

You need to use ShowDialog instead of Show thats the problem. Show dont block the application and the code keeps running.

You are disposing the object when the GUI is creating it (that what the exception said)

Try with this:

if (frmMain.objfrm== null)
{   
     frmMain.objfrm = frmMyForm.Instance;     
     frmMain.objfrm.ShowInTaskbar = false;    
}
frmMain.objfrm.ShowDialog();

Note the ShowDialog()

Upvotes: 0

user218447
user218447

Reputation: 659

it is hard to say what is the problem from the code you posted.

The code that you posted should work (form shown with Show() should be possible to close with Dispose() method).

The reason why it does not work is probably somewhere in the form that you are trying to dispose of. When you call Dispose() method (according to the error message this is what happens) on an object, that object will try to dispose of all its children and do some cleanup. That is the place to look for error.

My suggestion is to comment out all your code in the form objfrm (or make new EMPTY form) and see if error happens. It should not happen. Then start adding commented code and see when the error happens. I bet it will be in the code that is being called as consequence of Dispose method.

Upvotes: 1

Related Questions