DataGridView使用虚拟模式实时显示数据表

时间:2010-04-26 22:02:22

标签: c# sql-server datagridview

我有一个DataGridView,它将显示数据库中的记录(日志条目)。一次可以存在的记录数量非常大。我想使用DataGridView的虚拟模式功能来显示数据页面,并最大限度地减少必须在给定时间通过网络传输的数据量。

轮询数据是不可能的。将同时运行多个客户端,所有客户端都在同一网络上并查看记录。如果他们都对数据进行轮询,则网络运行速度非常慢。

数据对用户是只读的;他们将无法编辑任何内容,只需查看即可。我需要知道数据库中何时发生更新,我需要使用虚拟模式相应地更新屏幕。如果用户正在查看的数据页面包含已更改的数据,他/她将在该页面上看到这些更新。如果对数据库中的数据进行了更新,但没有对用户正在查看的数据进行更新,则用户屏幕上的更改并不多(如果添加或删除了记录,可能只是滚动条)。

我目前的方法是使用SQL服务器更改跟踪与同步框架。每个客户端都有一个本地SQL Server CE实例和数据库文件,该文件与主数据库服务器保持同步。我使用同步事件中的信息来查看是否对主数据库进行了任何更改并将其同步到客户端。我需要在这里使用DataGridView虚拟模式,因为我不能同时将数千条记录加载到DataGridView中,否则内存使用会进入屋顶。

现在的主要挑战是了解如何使用虚拟模式为用户提供无缝体验,允许他们在记录中上下滚动,并且还可以动态更新记录而不会不恰当地干扰用户。有没有人以前处理过这个问题,如果有的话,我在哪里可以看到他们是如何做到的?我已经浏览了一些关于虚拟模式的MSDN文档和示例。到目前为止,我还没有在他们的网站上找到解释如何做我想要完成的事情的文档和/或示例。

1 个答案:

答案 0 :(得分:2)

将以下内容添加到表单启动

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

在收到更新的地方使用以下代码

dataGridView1.RowCount = (int)rowscount.TotalCount;

添加以下功能:

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