The Magic Of DataGridView

本文关键字:DataGridView Of Magic The | 更新日期: 2023-09-27 17:49:31

我有一个Windows窗体,包含一个文本框和一个数据视图。只要文本框的文本被更改,datagridview的数据源就会更新。这是通过处理文本框的TextChanged事件并为数据源分配一个新的List来实现的。通常,新数据源包含1000多行,这是相当大的数据量。此外,查询DB来获取这个列表也很耗时。

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

  1. TextChange
  2. 获取数据
  3. 刷新DataGridView(不进行渲染/绘制)
  4. TextChange
  5. 获取数据
  6. 刷新DataGridView(不进行渲染/绘制)
  7. …TextChange
  8. 获取数据
  9. 刷新DataGridView(最终渲染/绘制)

这就像文本框是在另一个线程,但它绝对不是。有人知道为什么吗?

The Magic Of DataGridView

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

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