vb ListView虚拟列表网上没找到什么可以实际应用的东西。请大家应用过此技术的高人赐教

解决方案 »

  1.   

    ListView虚拟列表??
    是一个什么东西?
      

  2.   

    这是windows应用的一个技术。vb net中也开始应用此技术了。用了这个,显示再多的数据也没有任何问题。因为它是动态加载数据。用到哪一部分,就加载哪一部分。而不是一次性加载全部数据,所以显得速度特快。省却等待的时间了。程序永远也不会卡死了。
      

  3.   

    如果仅是显示,那这个不复杂,自己实现呗,没几句代码,思路巨简单,代码也巨简单.代码方面,唯一要管理的就是一个滚动条,然后在滚动值有变化时更新LISTVIEW里的内容而已.比如有100000000条数据,但你工程里窗体大小有限,LISTVIEW最多只能在屏幕上显示30条,那你就把滚动条设置为(100000000 - 30)的最大值,然后加载(滚动值-16)到(滚动值+13)这个范围的内容就行了.别被"虚拟列表"这四个字吓到了....
      

  4.   

    前年就是帮别人改一个程序,日志查看列表就是一开始打开卡死,最后日志多了后直接崩溃.就直接扔了个滚动条上去,搞定.只不过对于有多选要求的LISTVIEW比较麻烦,需要记录更多的信息,但也不是解决不了的事.
      

  5.   

    嘿嘿,俺以前曾经在脑子里想过这个问题,后来因为数据量一直没到这么恐怖的地步,也就没写代码,今天算是学习了,呵呵。
    主要思路就是自己设计一个滚动条,控制这个滚动条来加载数据,不过要用到一大堆的API函数,我在将数据显示到MSFLEXGRID表格的时候,就是用API控制滚动条的。可以设定每次滚动的行数等,原理应该和这个差不多。
      

  6.   

    烦请各位写个小例子。这样,我好理解。不然,无头绪。listview本身有滚动条,再加滚动条为什么?
    麻烦各位了。请不吝赐教。
      

  7.   

    加个纵向滚动条覆盖listview,在滚动条控件的change事件里处理要显示的内容。
      

  8.   

    自己做个控件得了,
    用文本框,列表框(可以自己弄多个,嘿嘿),垂直滚动条,做一个combobox好了。
      

  9.   

    看来很多人都不了解LV虚表模式
    贴一段powerbasic的,看你能理解翻译不
    #COMPILE EXE
    #RESOURCE "PBNote3.pbr"
    #DIM ALL
    #INCLUDE ONCE "Win32Api.Inc"
    #INCLUDE ONCE "CommCtrl.inc"GLOBAL hDlg AS DWORD
    GLOBAL ghInstance AS DWORD '入口句柄
    GLOBAL nItem() AS STRING
    GLOBAL nSubItem1() AS STRING
    GLOBAL nSubItem2() AS STRING
    GLOBAL LvHwnd AS DWORD%IDC_LISTVIEW=999FUNCTION WINMAIN (BYVAL hInstance AS LONG, BYVAL hPrevInstance AS LONG, BYVAL lpCmdLine AS ASCIIZ PTR, BYVAL iCmdShow AS LONG) AS LONG
        ghInstance = hInstance    DIALOG NEW 0, "Dialog Title",,, 300, 200,%WS_POPUP OR %WS_VISIBLE OR %WS_CLIPSIBLINGS OR %WS_CLIPCHILDREN OR _
                  %WS_CAPTION OR %WS_SYSMENU OR %WS_THICKFRAME OR %WS_MINIMIZEBOX OR _
                  %WS_MAXIMIZEBOX, TO hDlg
        DIALOG SHOW MODAL hDlg CALL MainProcEND FUNCTION
    'TYPE LV_COLUMN
    '    mask AS DWORD
    '    fmt AS LONG
    '    cx AS LONG
    '    pszText AS ASCIIZ PTR
    '    cchTextMax AS LONG
    '    iSubItem AS LONG
    '    iImage AS LONG
    '    iOrder AS LONG
    'END TYPE
    FUNCTION CreateListView(BYVAL ParentHwnd AS DWORD) AS DWORD   '创建
        LOCAL R AS RECT,lvWnd AS DWORD,i AS LONG
        LOCAL oldStyle AS LONG
        LOCAL himlSmall AS DWORD,himlLarge AS DWORD
        LOCAL LVC AS LV_COLUMN
        LOCAL hBmp0 AS DWORD,hBmp1 AS DWORD
        LOCAL Tmp AS STRING
        LOCAL ITEM_COUNT AS LONG    ITEM_COUNT=100000    GetClientRect ParentHwnd, R    lvWnd = CreateWindowEx(0, _
                $WC_LISTVIEW, _
                "", _
                %WS_CHILDWINDOW OR %WS_VISIBLE OR %LVS_OWNERDATA OR %LVS_SHOWSELALWAYS OR %LVS_SINGLESEL OR %LVS_REPORT OR %LVS_NOCOLUMNHEADER, _
                R.nLeft, R.nTop, R.nRight - R.nLeft, R.nBottom - R.nTop, _
                ParentHwnd, _
                %IDC_LISTVIEW, _
                ghInstance, _
                BYVAL 0&)    IF lvWnd = 0 THEN EXIT FUNCTION    oldStyle = SendMessage(lvWnd, %LVM_GETEXTENDEDLISTVIEWSTYLE, 0, BYVAL 0&)
        oldStyle = oldStyle OR %LVS_EX_FULLROWSELECT OR %LVS_EX_HEADERDRAGDROP  'OR %LVS_EX_GRIDLINES
        CALL SendMessage(lvWnd, %LVM_SETEXTENDEDLISTVIEWSTYLE, 0, BYVAL oldStyle)    himlSmall = ImageList_Create(16, 16, %ILC_COLORDDB OR %ILC_MASK, 1, 0)    IF himlSmall THEN
            hBmp0 = LoadImage(ghInstance, "B9",%IMAGE_ICON,0, 0,%LR_SHARED)
            ImageList_AddIcon himlSmall, hBmp0
            SendMessage lvWnd, %LVM_SETIMAGELIST, %LVSIL_SMALL, BYVAL himlSmall
            DestroyIcon hBmp0
        END IF    LVC.mask = %LVCF_TEXT OR %LVCF_FMT OR %LVCF_SUBITEM OR %LVCF_WIDTH
        LVC.fmt = %LVCFMT_LEFT
        LVC.cx = 120
        FOR i = 0 TO 2
            Tmp="Test Column " & FORMAT$(i+1)
            LVC.pszText = STRPTR(Tmp)
            SendMessage lvWnd, %LVM_INSERTCOLUMN, i, VARPTR(LVC)
        NEXT i    SendMessage lvWnd, %LVM_DELETEALLITEMS, 0, BYVAL 0&
        SendMessage lvWnd, %LVM_SETITEMCOUNT, ITEM_COUNT, BYVAL %LVSICF_NOINVALIDATEALL OR %LVSICF_NOSCROLL
        LOCAL hFont1 AS LONG
        hFont1=SetFont1("宋体",9,%FW_LIGHT)
        SendMessage lvWnd,%WM_SETFONT,hFont1,MAKLNG(%True,0)    REDIM nItem(ITEM_COUNT)
        REDIM nSubItem1(ITEM_COUNT)
        REDIM nSubItem2(ITEM_COUNT)
        FOR i=0 TO ITEM_COUNT
            nItem(i)="nItem" & FORMAT$(i)
            nSubItem1(i)="nSubItem1_" & FORMAT$(i)
            nSubItem2(i)="nSubItem2_" & FORMAT$(i)
        NEXTEND FUNCTION'TYPE NMLVDISPINFO
    '    hdr  AS NMHDR
    '    item AS LVITEM
    'END TYPE
    '
    'TYPE LVITEM
    '    mask       AS DWORD
    '    iItem      AS LONG
    '    iSubItem   AS LONG
    '    STATE      AS DWORD
    '    stateMask  AS DWORD
    '    pszText    AS ASCIIZ PTR
    '    cchTextMax AS LONG
    '    iImage     AS LONG
    '    lParam     AS LONG
    '    iIndent    AS LONG
    '    iGroupId   AS LONG
    '    cColumns   AS DWORD        ' tile view columns
    '    puColumns  AS DWORD PTR
    'END TYPE'TYPE LVFINDINFO
    '    flags AS DWORD
    '    psz AS ASCIIZ PTR
    '    lParam AS LONG
    '    pt AS POINTAPI
    '    vkDirection AS DWORD
    'END TYPE'TYPE NMLVFINDITEM
    '    hdr    AS NMHDR
    '    iStart AS LONG
    '    lvfi   AS LVFINDINFO
    'END TYPECALLBACK FUNCTION MainProc() AS LONG
        LOCAL NMH AS NMHDR PTR
        LOCAL LVDI AS NMLVDISPINFO PTR
        LOCAL Rtn AS LONG
        LOCAL tmpStr AS STRING
        STATIC i AS LONG, j AS LONG, k AS LONG    SELECT CASE AS LONG CB.MSG
      '------------------------------------------------------------------
        CASE %WM_INITDIALOG
            LvHwnd=CreateListView(CB.HNDL)
        CASE %WM_NOTIFY        NMH=CB.LPARAM
            SELECT CASE @NMH.code
                CASE %LVN_GETDISPINFO
                    LVDI=CB.LPARAM
                    IF @LVDI.item.iSubItem THEN
                        IF @LVDI.item.mask AND %LVIF_TEXT THEN
                            IF @LVDI.item.iSubItem=1 THEN
                                @LVDI.item.pszText=STRPTR(nSubItem1(@LVDI.item.iItem))
                            ELSEIF @LVDI.item.iSubItem=2 THEN
                                @LVDI.item.pszText=STRPTR(nSubItem2(@LVDI.item.iItem))
                            END IF
                        END IF
                    ELSE
                        IF @LVDI.item.mask AND %LVIF_TEXT THEN
                            @LVDI.item.pszText=STRPTR(nItem(@LVDI.item.iItem))
                            IF @LVDI.item.mask AND %LVIF_IMAGE THEN @LVDI.item.iImage = 0
                            IF @LVDI.item.mask AND %LVIF_INDENT THEN @LVDI.item.iIndent = 0
                            IF @LVDI.item.mask AND %LVIF_STATE THEN @LVDI.item.state = 0
                        END IF
                    END IF
                CASE %LVN_ODCACHEHINT
                    '数组都准备好了,没必要进行缓冲
                CASE %LVN_ODFINDITEM
                    LOCAL pFindInfo AS NMLVFINDITEM PTR                pFindInfo=CB.LPARAM
                    MSGBOX @pFindInfo.lvfi.@psz,,"FIND"     '获取要查找的字符串                [email protected]'不让他执行搜索,直接返回当前位置
                    EXIT FUNCTION
            END SELECT
        CASE %WM_DESTROY
            PostQuitMessage(0)
        END SELECTEND FUNCTIONFUNCTION SetFont1(BYVAL FontName AS STRING,BYVAL FontSize AS LONG,OPT FontStyle AS LONG) AS DWORD 'FontStyle常用的%FW_NORMAL,%FW_BOLD,%FW_LIGHT,%FW_HEAVY
         LOCAL hDc AS DWORD,LogPixelsy AS LONG
         LOCAL lffont AS LOGFONT
         LOCAL LfWeight AS LONG,m_hFont AS LONG     IF VARPTR(FontStyle)=0 THEN
             LfWeight=%FW_NORMAL '默认
         ELSE
             LfWeight=FontStyle
         END IF     hDc=GetDc(%HWND_DESKTOP)
         LogPixelsy=GetDeviceCaps(hDc,%LOGPIXELSY)
         ReleaseDC %HWND_DESKTOP,hDc
         lffont.lfheight=-MulDiv(FontSize,LogPixelsy,72)
         lffont.lfweight=LfWeight
         lffont.lfoutprecision=%OUT_TT_PRECIS '4
         lffont.lffacename=FontName
         m_hFont=CreateFontIndirect(lffont)     FUNCTION=m_hFont
    END FUNCTION
      

  10.   

     
    startbin:请将powerbasic的代码给翻译一下,我没看明白。
      

  11.   

    都是些api调用语法都相近vb的 没什么看不懂的 自己把声明补上 一些语法符号的修改 完全可以照搬的
      

  12.   

    那就劳烦您改改。实在不知如何改。powerbasic从来没接触过。不了解其语法。