这个问题很简单,很多人都会知道Listview
即使被隐藏也要慢得多。有一些建议,如:
还有什么其他建议?
LockWindowUpdate
如何运作?它等于ListView.Visible = False
吗?可以使用此API锁定两个或更多Listviews
吗?
修改
HyperList看起来很棒,但它的使用很复杂,有人可以简化它或解释调用者的结果,即如何填充阵列。
答案 0 :(得分:1)
这里最明显的解决方案是你提到的所有人之间的交叉;基本上是分页加载一个设定的数字,然后允许用户使用ListView
控件上方或下方的编号页面序列向后和向前翻页。
要进一步加快,请不要使用有效RecordSet
;相反,将数据加载到数组中并直接将信息放入控件中。如果要编辑信息而不是在ListView控件中进行编辑,请使用替代表单。
或者您可以创建自己的ListView
等效项,并使用您自己的格式将对象直接写在表单上。
我认为如果你必须使用LockWindowUpdate
这样的东西,那么你就走错了路。您应该只能使用控件的相应属性来防止用户干扰。
- 编辑 -
我们的想法是将数据读入内存中的数组,然后循环遍历它并以与此类似的方式填充ListView
:
Private Function TestInsertListView() As Long
Dim i As Long
Dim j As Long
Dim lT As Long
Dim itmX As ListItem
lT = timeGetTime
' Add first row
With lvwTest
i = 1
Set itmX = .ListItems.Add(, , "Row" & i & ";Col 1")
For j = 2 To mcCOLS
itmX.SubItems(j - 1) = "Row" & i & ";Col" & j - 1
Next
For i = 2 To m_iRows
Set itmX = .ListItems.Add(i, , "Row" & i & ";Col 1")
For j = 2 To mcCOLS
itmX.SubItems(j - 1) = "Row" & i & ";Col" & j - 1
Next
Next
End With
TestInsertListView = timeGetTime - lT
End Function
(我找到了上面的例子here。)
显然,您需要修改上述内容以包含数据读取,但这应该非常简单。 This link提供了ADO GetRows
方法的演示,该方法允许您读取数据。
答案 1 :(得分:1)
建议#1 - 您可以在列表视图控件的顶部超级重置唯一的垂直滚动条,或者继承ListView控件的子类。
或者,您可以使用ItemClick()事件(单击列表底部附近的项目)来确定是否需要加载更多行。
不要使用LockWindowUpdate - 这意味着用于拖放时需要绘制属于其他进程的窗口的进程。 Google OldNewThing LockWindowUpdate用于解释其工作原理以及使用它的原因是一个坏主意。 它不等于ListView.Visible = False。通过此API调用,您一次只能使用一个窗口。
使用以下SendMessage调用来禁用和启用更新。
Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_SETREDRAW As Long = &HB
Private Const SR_ON As Long = 1
Private Const SR_OFF As Long = 0
SendMessage ListView.hWnd, WM_SETREDRAW, SR_OFF, 0&
SendMessage ListView.hWnd, WM_SETREDRAW, SR_ON, 0&