Compartir a través de


Forcing handle creation in a .NET Windows Forms control

I believe no serious .NET developer has never faced a System.InvalidOperationException with an error message stating "Invoke or BeginInvoke cannot be called on a control until the window handle has been created." when trying, for example, to add text to a RichTextBox control. This type of error is caused by the fact that the underlying Windows control handle has not yet been created. You can test handle creation by calling the IsHandleCreated method on the control. To force creation of the control's handle you can simply try reading the Handle property like this:

   if (!mycontrol.IsHandleCreated)
{
// This call forces creation of the control's handle.
IntPtr handle = mycontrol.Handle;
}

This code works because the Handle property in the System.Windows.Forms.Control class makes a call to the protected method CreateHandle if the control's handle has not yet been created:

public IntPtr get_Handle()
{
if ((checkForIllegalCrossThreadCalls && !inCrossThreadSafeCall) && this.InvokeRequired)
{
throw new InvalidOperationException(SR.GetString("IllegalCrossThreadCall", new object[] { this.Name }));
}
if (!this.IsHandleCreated)
{
this.CreateHandle();
}
return this.HandleInternal;
}

Comments

  • Anonymous
    October 22, 2013
    thanks a lot  ---   works like a charm!

  • Anonymous
    January 02, 2017
    Thank you, that was very helpful