Home > Enterprise >  InvalidOperationException error in Invoke or BeginInvoke cannot be called on a control until the win
InvalidOperationException error in Invoke or BeginInvoke cannot be called on a control until the win

Time:01-25

InvalidOperationException error in Invoke or BeginInvoke cannot be called on a control until the window handle has been created on BeginInvoke i am getting an error while throw an exeception ex where the ex shown BeginInvoke error and can u refer some method.And i getting error in ex where throws the error can someone please tell some other method? I thank in advance!!


private void UpdateGrid(DataTable table)
{
if (dataGridView1.InvokeRequired)
{
 UpdateGridThreadHandler handler = UpdateGrid1
dataGridView1.BeginInvoke(handler, table) 
             }
 else
             {
 dataGridView1.DataSource = table;
 
             }
         }
 
 }
 
 //and the Exception i tried and i keeping try as empty
 try
 {
 }
 catch(Exeception ex)
 {
 writelog.writeline(DateTime.Now.ToString() "-LoadData-" ex.Message)
>!  }

where ex indicates the error of Invoke or BeginInvoke cannot be called on a control until the window handle has been created

CodePudding user response:

The error message "InvalidOperationException error in Invoke or BeginInvoke cannot be called on a control until the window handle has been created" indicates that the control (dataGridView1) is being accessed before its handle has been created.

A possible solution to this is to check if the control's handle has been created before attempting to access it. You can do this by checking the IsHandleCreated property of the control before calling the Invoke or BeginInvoke method.

Here's an example of how you can modify your code to check for the handle before updating the grid:

private void UpdateGrid(DataTable table)
{
    if (dataGridView1.IsHandleCreated)
    {
        if (dataGridView1.InvokeRequired)
        {
            UpdateGridThreadHandler handler = UpdateGrid1
            dataGridView1.BeginInvoke(handler, table) 
        }
        else
        {
            dataGridView1.DataSource = table;
        }
    }
    else
    {
        // handle not yet created, wait and try again
        Thread.Sleep(100);
        UpdateGrid(table);
    }
}

Another way to handle this situation is to use the Control.InvokeIfRequired or Control.BeginInvokeIfRequired method, which does the checking for you internally, you can use this directly with your method and pass the control and the method or delegate you want to execute.

private void UpdateGrid(DataTable table)
{
    dataGridView1.InvokeIfRequired(() => dataGridView1.DataSource = table);
}

You can also use Control.InvokeIfRequired or Control.BeginInvokeIfRequired method to pass the exception directly to the UI thread and show it there instead of using the try-catch block.

try
{
    // code that may throw an exception
}
catch(Exception ex)
{
    dataGridView1.InvokeIfRequired(() => MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error));
}
  • Related