我想在虚拟模式下在datagridview中显示“大量的大量数据”。
我使用缓冲区存储n (2)页的数据,最初2页存储在缓冲区中。当网格视图滚动到缓冲区中不存在的行时,我将加载当前的新页,并将其与旧页交换。
为了模拟将大量数据从数据库加载到缓冲区中,我添加了以下一行: System.Threading.Thread.Sleep(3000);
因此,当缓冲区更新自身时,网格就会在这段时间内被冻结。
现在,正如我所理解的,在这里添加一个线程不会有帮助,因为只有当滚动到达未缓冲的行时才会发生1次操作。
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,以便在更新缓冲区的方法中显示/隐藏图像:
if (ProgressEvent != null)
ProgressEvent(true);
System.Threading.Thread.Sleep(3000);
if (ProgressEvent != null)
ProgressEvent(false);在form事件处理程序上设置图像的可见属性,但是结果并不像预期的那样,我猜睡眠发生在事件被处理之前,所以图像在睡眠之前没有出现。
所以我想还需要一个脚步声。但不知道它什么时候开始的,它该怎么办?
更新:
我厌倦了建议的背景工作者:
在由CellValueNeeded事件调用的方法中,我检查所请求的行是否被缓冲,如果没有,则启动后台工作者。
if (!bgWorker.IsBusy) //otherwise worker will be started for every column of the row
{
bgWorker.DoWork += (sender, e) =>
{
UpdateBuffer(rowIndex);
};
bgWorker.RunWorkerAsync();
}
return "null"; 这是:
bgWorker.RunWorkerCompleted += (sender, e) =>
{
if (IvalidateEvent != null)
IvalidateEvent(); //send event to form, where invalidate the gridview dataGridView1.Invalidate();
}; 这是可行的,但也有一些问题: 1)我在我的网格中得到了许多虚拟的结果,即使时间不长--我不太喜欢它。2)如果我现在就离开它,甚至需要更多的时间,这可能是因为后台工作人员消耗了一些时间,而且我实际上使网格失效,并2次调用CellValueNeeded事件(第一次开始后台工作,第二次在它完成工作时启动)!
发布于 2011-04-21 13:38:24
当您到达未缓冲的行时,调用您的代码在第二个线程(新线程、线程池、后台工作人员)中获取所需的数据.(选一个)
在此异步操作启动后,进行“加载.”可见控制
(在这里,您可能希望禁用部分UI,直到操作完成为止)
现在返回一个空字符串或其他虚拟值..。
异步操作应该获得所需的数据,然后调用另一个方法ui线程(调用调用(.)在您的表单的对象上)
调用调用是为了避免跨线程用户界面交互。
在被调用的方法中,您应该使用获取的数据填充缓冲区,隐藏“加载.”控件,使相应的行或单元格无效( datagridview有方法执行此操作),最后但并非最不重要的是,如果有必要,可以重新启用您的UI。
https://stackoverflow.com/questions/5744158
复制相似问题