DataGridView的魔力

时间:2012-12-26 19:50:08

标签: c# winforms datagridview

我有一个Windows窗体,包含一个文本框和一个datagridview。一旦文本框的文本发生更改,datagridview的数据源就会更新。它通过处理文本框的TextChanged事件并为数据源分配新的List来完成。通常,新数据源包含1000多行,相当大量的数据。此外,查询数据库以获取此列表也很耗时。

让我感到惊讶的是,如果我在文本框中输入足够快,则数据网格会一次又一次地暂停渲染,并且只会渲染最终结果。它完全忽略了中间结果。这是有道理的,因为在连续的文本更改期间运行的UI线程正忙。但为什么我仍然可以输入文本框?

  1. TextChange
  2. 获取数据
  3. 刷新DataGridView(不渲染/绘画)
  4. TextChange
  5. 获取数据
  6. 刷新DataGridView(不渲染/绘画)
  7. ... TextChange
  8. 获取数据
  9. 刷新DataGridView(最终渲染/绘画)
  10. 完成。
  11. 就像文本框在另一个帖子上,但绝对不是。有人知道为什么吗?

1 个答案:

答案 0 :(得分:6)

这不是DataGridView特有的,任何Windows窗口都自动具备此功能。它由消息队列提供,这是一个与显示窗口的线程相关联的数据结构。当线程忙于执行其他操作时,Windows会在输入事件(如鼠标按键单击或键盘按键)上向队列添加消息。

一旦线程完成它正在做的事情,它就会重新进入消息循环(由Application.Run()启动的循环),从队列中检索消息并处理它。哪个回合导致TextChange事件触发。因此,可视化队列的一种好方法是作为缓冲区。默认情况下,它最多可以存储10,000个事件。