Hello all,
Pardon the topic name, but this error has been giving us a lot of trouble and after weeks of investigating we still have no idea how, when, or why it happens.
We use background workers but the grid that's getting this error is independent of the BG.
If someone can please tell us when the error happens so we can trap it, that would be great.
Attached is the error message we're getting when the "Red X" happens.
Thank you very much.
phenomenex said:We use background workers but the grid that's getting this error is independent of the BG.
How independent is it? Sometimes it's not so easy to tell. The most common case where threading causes a problem like this is where the background thread does something to the data source - not directly to the grid. But the data source then fires events which get handled by the BindingManager, which then raises notifications to the grid. So if you thread does anything that might affect the grid's data source, it could easily be causing this issue.
Another characteristic of threading problems is that the usually occur seemingly at random. The exception will often occurlong after the background thread has completed or when the application is doing something that is not even related to the grid. These issues are impossible to trap and notoriously difficult to track down, because the actual problem occurs long before the exception does.
The red X basically means that there was an exception during the control's OnPaint event. This is most commonly caused by threading issues, but it's not the only possible cause. Can you reliably reproduce the error? If so, it's probably not a threading issue.
Mike,
I have a User-Control with a grid. This UC has a "Refresh" Method, which refreshes the Grid's Datasource. This method is invoked by the "DoWork" event of the BackgroundWorker. As you well said, this error is impossible to track down and unreliable to replicate.
I read something about "Invoke" but I am not sure how to do this. How can I make sure that this doesn't happen? We set the Datasource of the grid to "Nothing", then do a "DoEvents" and then set it to the new datatable that's being pulled out of the DB.
Do you have any suggestions?
Thanks!
You need to make something like this:
public void SetDataSource(DataTable table)
{
if (grid.InvokeRequired)
grid.Invoke(new Action<DataTable>(SetDataSource), table);
}
else
grid.DataSource = table;