首页 / 知识

关于C#:虚拟Listview控件的(主)缓冲区中应该有几行?

2023-04-14 09:51:00

关于C#:虚拟Listview控件的(主)缓冲区中应该有几行?

How many rows should be in the (main) buffer of a virtual Listview control?

虚拟Listview控件的(主)缓冲区中应有多少行?

我正在用Win32 API的纯" c"样式显示一个应用程序。到数据库的ODBC连接将检索项目(实际上是行)。

MSDN示例代码暗含一个30的固定大小的缓冲区,用于端缓存(几乎肯定不是最佳选择)。我认为末端缓存和主缓存应具有相同的大小。

我的想法是缓冲区应该大于列表视图一次可以显示的最大项目数。我想每次调整Listivew的大小时都可以重新计算?

或者,采用较大的固定值是否更好?如果是这样,那是什么值?


LVN_ODCACHEHINT通知消息将使您知道它要询问多少个项目。这可以帮助您确定缓存的大小。


使用ListView_roximateViewRect(或LVM_APPROXIMATEVIEWRECT消息)获取视图的矩形高度。

使用ListView_GetItemRect(或LVM_GETITEMRECT消息)获取项目的高度。

将视图区域的高度除以项目的高度,以获取可以容纳在视图中的项目数。
对每个大小事件进行此计算。

然后相应地创建缓冲区。


答案似乎是:(或者我随便摆弄想法的随机笔记集)

作为缓冲区的一般答案:
从一定数量开始,在这种情况下,屏幕已满(我添加了一个额外的行,以防部分隐藏下一个),然后每次滚动屏幕时,将缓冲区大小加倍(直到内存不足之前的大小) )。

这似乎是错误的。事实证明,大多数加载数据的方式都已准备好进行缓冲。文件I / O的ODBC调用。我几乎无法想到的所有东西要么都在内存中,要么是即时重新计算的。这意味着答案确实是:采用LVN_ODCACHEHINT中提供的值(并在每侧加1-如果您没有整数的高度,这似乎工作得更快)。


@Brian R. Bondy感谢您对如何获得物品数量的明确帮助。实际上,我已经准备好以自己的方式了解可以使用ListView_GetCountPerPage来完成此操作(对于列表视图还是报表视图),并且我将使用您的方式将其用于其他对象,尽管自从我不需要ListView_近似ViewRect以来,所有人都将知道ListView的新大小。

@Lars Truijens我已经在使用LVN_ODCACHEHINT了,尽管已经使用它来设置缓冲区大小,但是我需要读到SQL数据的末尾以找到最后一项,以获取从ODBC返回的行数。由于那是填充"结束缓存"的最佳时间,我想我必须先设置项目数量(并因此填充缓冲区),然后才能调用LVN_ODCACHEHIN。

我想我的真正问题是优化,我认为Brian暗示了答案。浪费缓冲区和重新分配内存的开销小于进入网络并进行ODBC读取的开销,有些会使缓冲区很小,并且经常更改它。

这是对的吗?

我已经做了很多工作,似乎认为LVN_ODCACHEHINT通常可以正确填充主缓冲区,并且仅当部分行(在报告模式下)可见时才会丢失。

因此,我认为缓存大小的答案是:显示项的总数,加上一行显示项(因为在图标视图中,每行有多个项)。

然后,如果每个WM_SIZE和LVN_ODCACHEHINT具有不同的开始和结束项目编号,则将重新读取该缓存。


虚拟控件显示数据库

最新内容

相关内容

猜你喜欢