proper way to update a datagrid from a separate thread (bringtofront error vs versionnotfoundexcepti

L

lloyd

i have a datagrid that i need to be updated every couple seconds in a
point-of-sale type application. i thought this was going to be easy but
apparently its not. i have a simple sql query to select a few columns from
a table and i want these to end up in a datagrid.

first time around i had a thread doing a fill as follows:

Dim da As New SqlClient.SqlDataAdapter("select c.clientid
,c.balance,c.connected,isnull(ac.security,0) creditid from client c left
join acctcredit ac on ac.creditid=c.creditid", sqlConn)
m_DataSet = New DataSet

da.Fill(m_DataSet, "Client")
Form.BeginInvoke(CallDataBindToDataGrid)

where calldatabindtodatagrid is:

Form.DataGridClients.DataSource = m_DataSet

but the result of that was that whenever the datagrid refreshed it both
reset the scroll position, and more important the form would be brought to
the
foreground as if bringtofront was called which caused major problems and so
this was obviously unacceptable.

for my next try i decided to just access the datatable directly with the
following code every period:

Me.DataTable1.BeginLoadData()
For i As Integer = 0 To DataTable1.Rows.Count - 1
DataTable1.Rows(i).ItemArray = DirectCast(ar(i), DataRow).ItemArray
Next
Me.DataTable1.EndLoadData()
Me.DataGridClients.Refresh()

but every so often this gives me an exception versionnotfoundexception
"there is no original data to access" which i have yet to be able to find a
workaround/fix for. its often enough that i'm working on a saturday morning
to fix it. so far my google's/newsgroup searches have found alot of other
people with the same problem but apparently no way around it.

so rather than keep on trying to fix specific errors or experimenting with
different ways of updating the datagrid, i ask: what is the right way to do
this. my goal is simply to have datagrid1 update every couple seconds in a
background thread. im still amazed how difficult this has proven but
hopefully im just missing something major and someone can point me in the
direction. thanks for putting up with the rather long and rambling post
too.

Lloyd
 
S

Sahil Malik

Try this -

Do a DataGrid.DataSource = DataSet out of all other code (i.e. define a
structure to the dataset, and databind it - it'll show no rows at this
point).

Then fire up the background thread.
That background thread will do dataadapter.fill on a similar dataset.
Then do Form.Invoke (I think it is in ISyncObject) to do a thread context
switch, and on the thread of the form call a dataset.merge (don't do
datasource = dataset at this time).

.... That's one approach.

Another is, just use a timer on one form.

- Sahil Malik
http://codebetter.com/blogs/sahil.malik/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top