views:

117

answers:

1

I have a DataGridView that will display records (log entries) from a database. The amount of records that can exist at a time is very large. I would like to use the virtual mode feature of the DataGridView to display a page of data, and to minimize the amount of data that has to be transferred across a network at a given time.

Polling for data is out of the question. There will be several clients running at a time, all of which are on the same network and viewing the records. If they all poll for data, the network will run very slowly.

The data is read-only to the user; they won't be able to edit any of it, just view it. I need to know when updates occur in the database, and I need to update the screen with those updates accordingly using virtual mode. If a page of data a user is viewing contains data that has change, he/she will see those updates on that page. If updates were made to data in the database, but not in the data the user is viewing, then not much really changes on the user screen (Maybe just the scroll bar if records were added or removed).

My current approach is using SQL server change tracking with the sync framework. Each client has a local SQL Server CE instance and database file that is kept in sync with the main database server. I use the information from the synchronization event to see if any changes were made to the main database and were sync'ed to the client. I need to use the DataGridView virtual mode here because I can't have thousands of records loaded into the DataGridView at once, otherwise memory usage goes through the roof.

The main challenge right now is knowing how to use virtual mode to provide a seamless experience to the user by allowing them to scroll up and down through the records, and also have records update on the fly without interfering with the user inappropriately. Has anybody dealt with this issue before, and if so, where I can see how they did it? I've gone through some of the MSDN documentation and examples on virtual mode. So far, I haven't found documentation and/or examples on their site that explains how to do what I am trying to accomplish.

A: 

Add following to form startup

 dataGridView1.CellValueNeeded +=new DataGridViewCellValueEventHandler( dataGridView1_CellValueNeeded );  
    dataGridView1.VirtualMode = true;

Use the following code where u receive the update

dataGridView1.RowCount = (int)rowscount.TotalCount;

Add following function :

private void dataGridView1_CellValueNeeded( object sender, DataGridViewCellValueEventArgs e )
            {
                _cache.LoadPage( e.RowIndex );    
                int rowIndex = e.RowIndex % PageSize;    
                e.Value = datatable.rows[rowIndex][e.ColumnIndex];
            }
Thunder