我有vsflex控件显示数据库的内容,当数据很多时,显示就特别慢,有什么好的办法解决没有,请大家帮帮我!

解决方案 »

  1.   

    vsflex好像有个属性是设置这个的吧.
    好像是visualData吧.
      

  2.   

    其实  VSFLEXGRID加载数据是比较快的,从数据库中读取一万条记录的时间也不少,另外,数据量比较大的时候,最好是使用分页技术,
      

  3.   

    vsflex好像有个属性是设置这个的吧.
    好像是visualData吧.
    要用到这个属性,是不是要与数据库绑定才行啊,可是我不想绑定啊,怎么办呢?
      

  4.   

    最好是做分页处理如果你是用 RS 记录集的方式的话你也可一页一页输出!!
    设置 Rs 的 Page 属性,如 AbsolutePage
      

  5.   

    最好是做分页处理如果你是用 RS 记录集的方式的话你也可一页一页输出!!
    设置 Rs 的 Page 属性,如 AbsolutePage
      

  6.   

    AbsolutePage、PageCount 和 PageSize 属性范例
    该范例使用 AbsolutePage、PageCount 和 PageSize 属性,以每次五个记录的方式显示雇员表中的姓名和受雇日期。Public Sub AbsolutePageX()
       
       Dim rstEmployees As ADODB.Recordset
       Dim strCnn As String
       Dim strMessage As String
       Dim intPage As Integer
       Dim intPageCount As Integer
       Dim intRecord As Integer   ' 使用客户端游标为雇员表打开一个记录集。
       strCnn = "Provider=sqloledb;" & _
          "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
       Set rstEmployees = New ADODB.Recordset
       ' 使用客户端游标激活 AbsolutePosition 属性。
       rstEmployees.CursorLocation = adUseClient
       rstEmployees.Open "employee", strCnn, , , adCmdTable
       
       ' 显示姓名和受雇日期,每次五个记录。
       rstEmployees.PageSize = 5
       intPageCount = rstEmployees.PageCount
       For intPage = 1 To intPageCount
          rstEmployees.AbsolutePage = intPage
          strMessage = ""
          For intRecord = 1 To rstEmployees.PageSize
             strMessage = strMessage & _
                rstEmployees!fname & " " & _ 
                rstEmployees!lname & " " & _ 
                rstEmployees!hire_date & vbCr
             rstEmployees.MoveNext
             If rstEmployees.EOF Then Exit For
          Next intRecord
          MsgBox strMessage
       Next intPage
       rstEmployees.CloseEnd Sub
      

  7.   

    VBDN(王水云) :
    你好 
      我用的是DAO,好象找不到你说的属性,怎么办啊!
      

  8.   

    在绑定数据之前,设置vsflexgrid的属性
    .Redraw = flexRDBuffered
      

  9.   

    .Redraw一共有三个取值:
    flexRDNone          --不刷新数据,要手工刷新数据才会显示
    flexRDDirect        --立即装入所有的数据,你应该是设置成了这个,所以速度慢
    flexRDBuffered      --显示部分数据,这种速度最快,调用数据的时候,只显示当前看到的
                          部分数据,当你拖动滚动条向下的时候,才逐步装入其他部分数据
      

  10.   

    zjcxc(邹建) :
    .redraw 这个属性,是不是也要绑定才行啊
    我的程序是这样子的 sSql = "SELECT * FROM B_clmxb INNER JOIN B_clmxh ON B_clmxb.no=B_clmxh.noh "
      sSql = sSql & "WHERE B_clmxb.pm='" & Trim(reCl!bh) & "' AND B_clmxh.ck='" & Trim(reCk!bh) & "' "
      sSql = sSql & " AND B_clmxh.yf>='" & Trim(lRqone) & "' AND B_clmxh.yf<='" & Trim(lRqtwo) & "' "
      sSql = sSql & "ORDER BY B_clmxb.no"
      
      Set reClmx = dbJxc.OpenRecordset(sSql, dbOpenDynaset)
      
      If reClmx.EOF And reClmx.BOF Then
          MsgBox "没有可供使用的数据,请确定!", vbInformation, "请确定"
      Else
          reClmx.MoveLast
          lClmx = reClmx.RecordCount
      End If
      VsClmx.Rows = lClmx + 2
      reClmx.MoveFirst
      For lMxjs = 2 To lClmx + 1
          If Right(Trim(reClmx!no), 5) <> "99998" And Right(Trim(reClmx!no), 5) <> "99999" Then
              dJysl = dJysl + reClmx!rksl - reClmx!cksl
              dJyje = dJyje + reClmx!rkje - reClmx!ckje
          End If
          With VsClmx
                If IsNull(reClmx!Djbh) Then
                    .TextMatrix(lMxjs, 1) = ""
                Else
                    .TextMatrix(lMxjs, 1) = IIf(IsNull(reClmx!ldrq), "", Day(reClmx!ldrq))
                End If
                .TextMatrix(lMxjs, 0) = "" & reClmx!yf
                .TextMatrix(lMxjs, 2) = "" & reClmx!Djbh
                .TextMatrix(lMxjs, 3) = "" & reClmx!zy
                .TextMatrix(lMxjs, 4) = IIf(reClmx!rksl = 0, "", FormatNumber(reClmx!rksl, 2, vbTrue, vbFalse, vbTrue))
                .TextMatrix(lMxjs, 5) = IIf(reClmx!rkdj = 0, "", FormatNumber(reClmx!rkdj, 4, vbTrue, vbFalse, vbTrue))
                .TextMatrix(lMxjs, 6) = IIf(reClmx!rkje = 0, "", FormatNumber(reClmx!rkje, 2, vbTrue, vbFalse, vbTrue))
                .TextMatrix(lMxjs, 7) = IIf(reClmx!cksl = 0, "", FormatNumber(reClmx!cksl, 2, vbTrue, vbFalse, vbTrue))
                .TextMatrix(lMxjs, 8) = IIf(reClmx!ckdj = 0, "", FormatNumber(reClmx!ckdj, 4, vbTrue, vbFalse, vbTrue))
                .TextMatrix(lMxjs, 9) = IIf(reClmx!ckje = 0, "", FormatNumber(reClmx!ckje, 2, vbTrue, vbFalse, vbTrue))
                .TextMatrix(lMxjs, 10) = FormatNumber(dJysl, 2, vbTrue, vbFalse, vbTrue)
                If dJysl <> 0 Then
                    .TextMatrix(lMxjs, 11) = FormatNumber(lRound(dJyje / dJysl, 4), 4, vbTrue, vbFalse, vbTrue)
                Else
                    .TextMatrix(lMxjs, 11) = 0#
                End If
                .TextMatrix(lMxjs, 12) = FormatNumber(dJyje, 2, vbTrue, vbFalse, vbTrue)
          End With
          reClmx.MoveNext
      Next lMxjs当总记录超过5000条时,就很慢了,请大家帮我看看,怎么办啊
      

  11.   

    建议:确定每页要显示的记录数,写一个分页函数,使用分页函数得到sSql,保证sSql每次查询出来的记录数<=每页要显示的记录数。
    举个简单的例子:
    10000记录,假设ID就是1到10000,每页要显示的记录数=20.
    那么读第一页的时候,ID>=1 and ID<=20
    读第100页的时候呢,ID>=2001 and ID<=2020
    分页函数的目的就是给出算法,算出ID的范围。
    一般要求ID是数字(整数或数字串)如果ID是整数,还有更简单的方法,可以使用asc desc 和 top 组合,但这样不容易任意页跳转,只能顺序上翻下翻。
      

  12.   

    问下,邹哥哥,使用vsflex遇到什么问题没?
    我遇到好多问题,所以放弃使用这个控件!
      

  13.   

    绑定数据源用啊,你怎么自己写循环往vsflexgrid里面填数据?逐个填数据再怎么写都慢啦.
      

  14.   

    zjcxc(邹建) 
    你好
      能给个绑定数据源的例子吗,谢谢你,我的email: [email protected]
      

  15.   

    我遇到问题是特别的多.估计不是我的问题.感觉这个控件讲的挺好,实际用时问题真多.
    还不错?我感觉不太好.控制起来我看还不如用mshflexgrid去模拟效果算了.
    不过有时也要用到它,呵呵.
    邹哥哥,你试试能不能连续输入中文?就是在不同的单元格之间.
      

  16.   

    Re.Open "表",conn, adOpenKeyset, adLockOptimistic
        With Vsf
            '一些显示属性的设置
            .Redraw = flexRDNone   '先不刷新数据
            .AllowUserResizing = flexResizeColumns
            .AutoSearch = flexSearchFromCursor
            .ExplorerBar = flexExSort
            .Rows = 1
            .DataMode = flexDMFree
            .FixedCols = 0        '绑定要显示的数据
            Set .DataSource = Re        '自动调整列的宽度(这里你也可以做其他设置,比如列的显示格式等)
            .AutoSize 0, .Cols - 1        '显示部分数据
            .Redraw = flexRDBuffered
        End With
        Re.Close
      

  17.   

    zjcxc(邹建) 
    你好
      我先试试,如果成功,我会给分的,谢谢你
    另外,我还有个问题:
      当设置某列 vs.ColComboList(1) = "..." 时,也就是输入的时候是点按钮实现选择方式,但当数据很多时,只能一个个的找,很麻烦,我想就是能在它上面输内容,再单击按钮,然后就查找出我需要显示的相关内容,再选择。
      请帮帮我,谢谢你!
      

  18.   

    zjcxc(邹建) 
    你好!
      我的显示好象还有只有逐个填了,你看下面的代码
     If Right(reClmx!no), 5) <> "99998" And Right(reClmx!no), 5) <> "99999" Then
              dJysl = dJysl + reClmx!rksl - reClmx!cksl  这里是计算显示在vs 表格中最后一列的数据,请看上面的例子中。
      End If
          With VsClmx
                If IsNull(reClmx!Djbh) Then
                    .TextMatrix(lMxjs, 1) = ""
                Else
                    .TextMatrix(lMxjs, 1) = IIf(IsNull(reClmx!ldrq), "", Day(reClmx!ldrq))
                End If
                .TextMatrix(lMxjs, 0) = "" & reClmx!yf
                .TextMatrix(lMxjs, 2) = "" & reClmx!Djbh
                .TextMatrix(lMxjs, 3) = "" & reClmx!zy
       这是上面的代码,因为我的数据并不都是直接可以显示出来的,有的是要从别的数据表中查询值的,你看看,我该怎么办啊!
      

  19.   

    zjcxc(邹建) 
    你好!
       帮我想想办法呀
      

  20.   

    你可以在构造记录集的时候处理呀,累似
    rs.open "select a,b,case when c=1 or c=2 then a+b else a-b end from table1",cn
      

  21.   

    yoki(小马哥--鬓微霜,又何妨) 
    你好
      就我的程序,使用方法会好些!
      

  22.   

    因为我有的记录显示时,需要从其它数据表中查找出值来显示,比如说,在a表中我存储的是b表中的编号1,但我要显示的是b表中编号为1的名称,这样我就要一条条的记录显示,并逐个查找,我不知道还有什么办法能够帮帮我啊!
      

  23.   

    Private Sub vs()
      Dim iInt As Integer
      Dim iPoint As Long
      
      sSql = "SELECT * FROM B_Clzlb ORDER BY B_clzlb.bh"
      Set rejxc11 = dbjxc.OpenRecordset(sSql, dbOpenDynaset)  With vsFclzl
            .Cols = 8
            
            For iPoint = 0 To 7
            .FixedAlignment(iPoint) = flexAlignCenterCenter
            .ColAlignment(iPoint) = flexAlignRightCenter
            Next iPoint
            
            .TextMatrix(0, 0) = "编号"
            .TextMatrix(0, 1) = "材 料 名 称"
            .TextMatrix(0, 2) = "商品分类"
            .TextMatrix(0, 3) = "计量单位"
            .TextMatrix(0, 4) = "型号"
            .TextMatrix(0, 5) = "规格"
            .TextMatrix(0, 6) = "备注"
            .TextMatrix(0, 7) = "状态"
             
      End With
      
       With vsFclzl        .Redraw = flexRDNone   '先不刷新数据
            .AllowUserResizing = flexResizeColumns
            .AutoSearch = flexSearchFromCursor
            .ExplorerBar = flexExSort
            .Rows = 1
            .DataMode = flexDMFree
            .FixedCols = 0        '绑定要显示的数据
            Set .DataSource = rejxc11     程序运行到这里,提示出类型错误,是怎么回事啊
            
            '自动调整列的宽度(这里你也可以做其他设置,比如列的显示格式等)
            .AutoSize 0, .Cols - 1        '显示部分数据
            .Redraw = flexRDBuffered
        End WithEnd Sub