首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据负载大的数据视图虚拟模式

数据负载大的数据视图虚拟模式
EN

Stack Overflow用户
提问于 2011-04-21 12:32:08
回答 1查看 2.7K关注 0票数 1

我想在虚拟模式下在datagridview中显示“大量的大量数据”。

我使用缓冲区存储n (2)页的数据,最初2页存储在缓冲区中。当网格视图滚动到缓冲区中不存在的行时,我将加载当前的新页,并将其与旧页交换。

为了模拟将大量数据从数据库加载到缓冲区中,我添加了以下一行: System.Threading.Thread.Sleep(3000);

因此,当缓冲区更新自身时,网格就会在这段时间内被冻结。

现在,正如我所理解的,在这里添加一个线程不会有帮助,因为只有当滚动到达未缓冲的行时才会发生1次操作。

代码语言:javascript
复制
  private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
    {

       e.Value = theBuffer.ReturnFromBuffer(e.RowIndex, e.ColumnIndex);
//I check there if row index is in buffer and if not i update the buffer with new page and return the value

    }

因此,我正在考虑增加一个“纺纱轮”动画之上的网格,当它发生。

我尝试将事件发送到form,以便在更新缓冲区的方法中显示/隐藏图像:

代码语言:javascript
复制
if (ProgressEvent != null)
     ProgressEvent(true);

System.Threading.Thread.Sleep(3000);

if (ProgressEvent != null)
     ProgressEvent(false);

在form事件处理程序上设置图像的可见属性,但是结果并不像预期的那样,我猜睡眠发生在事件被处理之前,所以图像在睡眠之前没有出现。

所以我想还需要一个脚步声。但不知道它什么时候开始的,它该怎么办?

更新:

我厌倦了建议的背景工作者:

在由CellValueNeeded事件调用的方法中,我检查所请求的行是否被缓冲,如果没有,则启动后台工作者。

代码语言:javascript
复制
 if (!bgWorker.IsBusy) //otherwise worker will be started for every column of the row
 {
      bgWorker.DoWork += (sender, e) =>
         {
           UpdateBuffer(rowIndex);                           
          };
       bgWorker.RunWorkerAsync();
 }
 return "null"; 

这是:

代码语言:javascript
复制
bgWorker.RunWorkerCompleted += (sender, e) =>
{
    if (IvalidateEvent != null)
        IvalidateEvent();  //send event to form, where invalidate the gridview  dataGridView1.Invalidate();
};            

这是可行的,但也有一些问题: 1)我在我的网格中得到了许多虚拟的结果,即使时间不长--我不太喜欢它。2)如果我现在就离开它,甚至需要更多的时间,这可能是因为后台工作人员消耗了一些时间,而且我实际上使网格失效,并2次调用CellValueNeeded事件(第一次开始后台工作,第二次在它完成工作时启动)!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-21 13:38:24

当您到达未缓冲的行时,调用您的代码在第二个线程(新线程、线程池、后台工作人员)中获取所需的数据.(选一个)

在此异步操作启动后,进行“加载.”可见控制

(在这里,您可能希望禁用部分UI,直到操作完成为止)

现在返回一个空字符串或其他虚拟值..。

异步操作应该获得所需的数据,然后调用另一个方法ui线程(调用调用(.)在您的表单的对象上)

调用调用是为了避免跨线程用户界面交互。

在被调用的方法中,您应该使用获取的数据填充缓冲区,隐藏“加载.”控件,使相应的行或单元格无效( datagridview有方法执行此操作),最后但并非最不重要的是,如果有必要,可以重新启用您的UI。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5744158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档