快速Listview加载

时间:2013-04-25 11:42:59

标签: listview vb6

这个问题很简单,很多人都会知道Listview即使被隐藏也要慢得多。有一些建议,如:

  1. 加载部分数据然后加载滚动,但默认情况下没有滚动事件
  2. 加载部分数据,然后提供按钮以加载更多(例如50条)记录
  3. 加载部分数据,显示屏幕,然后使用计时器加载剩余数据
  4. 还有什么其他建议?

    LockWindowUpdate如何运作?它等于ListView.Visible = False吗?可以使用此API锁定两个或更多Listviews吗?

    修改

    HyperList看起来很棒,但它的使用很复杂,有人可以简化它或解释调用者的结果,即如何填充阵列。

2 个答案:

答案 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&