当前位置:编程学习 > VB >>

请教各位一个严重的问题,为什么用MSHFlexGrid比ListView1快很多

请教各位一个严重的问题,为什么用MSHFlexGrid比ListView1快很多,我用ListView1时查询数据库5000行数据要10秒,试用MSHFlexGrid时不到1秒,能否用ListView1达到MSHFlexGrid的速度,望请各位指导、修改,因为我全部用ListView1。谢谢

用ListView1
ListView1.ListItems.Clear
 Call OpenCNN
    
  If Len(Combo1.Text) = 0 And Len(Combo2.Text) = 0 Then
sql = "SELECT 商品表.供应商id, 检验单.ID,检验单.厂家批次,检验单.供应商属性, 检验单.送货单号, 检验单.检验人员,商品表.物料名称,检验单.ROHS测试批,检验单.ROHS不合格批,检验单.免检批,检验单.不测试批,检验单.进仓批,检验单.不合格批,检验单.退货批,检验单.回用批,检验单.反馈批,检验单.级别,检验单.检验结果,检验单.ROHS结论,检验单.ROHS属性,检验单.不合格处理,检验单.不合格数, 检验单.不合格内容,商品表.物料编码, 商品表.型号规格, 供应商表.供应商名称, 商品表.类别名称, 检验单.数量, 检验单.送货日期 FROM (商品表 INNER JOIN 检验单 ON 商品表.供应商id = 检验单.物料名称) INNER JOIN 供应商表 ON 检验单.供应商名称 = 供应商表.id WHERE 检验单.送货日期 >= '" & DTPicker1 & "' and 检验单.送货日期 <= '" & DTPicker2 & "' "   
 End If
  Rst.Open sql, CNN, 1, 3
  On Error Resume Next
  ProgressBar1.Max = Rst.RecordCount
  For i = 1 To Rst.RecordCount
  Set LV1 = ListView1.ListItems.Add
  LV1.Text = Rst.Fields("id")
  LV1.SubItems(1) = Rst.Fields("送货日期")
  LV1.SubItems(2) = Rst.Fields("送货单号")
  LV1.SubItems(3) = Rst.Fields("级别")
  LV1.SubItems(4) = Rst.Fields("数量")
  LV1.SubItems(5) = Rst.Fields("不合格数")
  LV1.SubItems(6) = LV1.SubItems(4) - LV1.SubItems(5)
  。。。。

用MSHFlexGrid:
MSH.Clear
  MSH.Cols = 2
  MSH.Rows = 2
 Call OpenCNN
  If Len(Combo1.Text) = 0 And Len(Combo2.Text) = 0 Then
sql = "SELECT 检验单.ID, 检验单.送货日期,检验单.送货单号, 检验单.级别, 检验单.数量,检验单.不合格数, 检验单.不合格内容,检验单.检验结果,检验单.ROHS结论,商品表.物料编码, 商品表.型号规格, 供应商表.供应商名称, 商品表.供应商id, 检验单.厂家批次,检验单.供应商属性, 检验单.检验人员,商品表.物料名称,检验单.ROHS测试批,检验单.ROHS不合格批,检验单.免检批,检验单.不测试批,检验单.进仓批,检验单.不合格批,检验单.退货批,检验单.回用批,检验单.反馈批,检验单.ROHS属性,检验单.不合格处理,商品表.类别名称 FROM (商品表 INNER JOIN 检验单 ON 商品表.供应商id = 检验单.物料名称) INNER JOIN 供应商表 ON 检验单.供应商名称 = 供应商表.id WHERE 检验单.送货日期 >= '" & DTPicker1 & "' and 检验单.送货日期 <= '" & DTPicker2 & "' "
  End If
  Rst.Open sql, CNN, 1, 3
  On Error Resume Next
  ProgressBar1.Max = Rst.RecordCount
  ' For i = 1 To MSH.Container
  Set MSH.DataSource = Rst
  Label9.Caption = "共 " & Rst.RecordCount & " 条记录"
  MSH.ColWidth(0) = 0
  For i = 0 To Rst.Fields.Count - 1
  MSH.ColWidth(i + 1) = Len(Rst.Fields(i).Name) * 200 + 400
  Rst.Close 猜想listview一行一行添加浪费时间吧,用listview增加速度应该没有办法,

用替换语句的方式可以把控件替换掉

引用 1 楼 jjhhgg1111 的回复:
猜想listview一行一行添加浪费时间吧,用listview增加速度应该没有办法,

用替换语句的方式可以把控件替换掉

不是猜想,本来就是
MSHFlexGrid直接连接数据集,不用手工填充,ListView1里手工填充,很费时
引用 2 楼 asftrhgjhkjlkttttttt 的回复:
引用 1 楼 jjhhgg1111 的回复:
猜想listview一行一行添加浪费时间吧,用listview增加速度应该没有办法,

用替换语句的方式可以把控件替换掉

不是猜想,本来就是
MSHFlexGrid直接连接数据集,不用手工填充,ListView1里手工填充,很费时

MSHFlexGrid 原来是这样的 学习了 一个绑定数据源
一个读取数据源然后再对记录一条条循环肯定慢了
引用 5 楼 ameken 的回复:
一个绑定数据源
一个读取数据源然后再对记录一条条循环肯定慢了


请教:能否对记录直接读取,麻烦您改一下代码
        Set LV1 = ListView1.ListItems.Add(, , Rst.Fields("id"))
        Call LV1.ListSubItems.Add(1, , Rst.Fields("送货日期"))
        Call LV1.ListSubItems.Add(2, , Rst.Fields("送货单号"))
        Call LV1.ListSubItems.Add(3, , Rst.Fields("级别"))
        Call LV1.ListSubItems.Add(4, , Rst.Fields("数量"))
        Call LV1.ListSubItems.Add(5, , Rst.Fields("不合格数"))

试试这样,不用赋值的形式. 学习...........
引用 7 楼 king06 的回复:
VB code
        Set LV1 = ListView1.ListItems.Add(, , Rst.Fields("id"))
        Call LV1.ListSubItems.Add(1, , Rst.Fields("送货日期"))
        Call LV1.ListSubItems.Add(2, , Rst.Fields("送货单号"))
      ……


试过了,这个方法还是不行,仍然是一行一行的读取,速度提高不明显
引用 2 楼 asftrhgjhkjlkttttttt 的回复:
引用 1 楼 jjhhgg1111 的回复:
猜想listview一行一行添加浪费时间吧,用listview增加速度应该没有办法,

用替换语句的方式可以把控件替换掉

不是猜想,本来就是
MSHFlexGrid直接连接数据集,不用手工填充,ListView1里手工填充,很费时

其他有没有办法提速?如果要把listview换掉,那工程量非常大,原因是我全部采用listview控件,程序达到200M了。 listview填充时候禁止刷新 填充完再允许刷新 效率能提高几倍的
更好的方法是用listview虚表的方式做 vb控件本身不支持 可以用api自己写 或者下载个老外的做好的代码
加载10w数据不用0.1秒 关键是listview是逐条刷新的,需要禁止刷新,等填充完活着填充5000条刷新一次,这样数据快很多。

具体代码如下:

'获 得listview的显示区域。
 Call GetClientRect(cLvwMer.hwnd, rc)

' 避免显示区域的闪动现象。
 Call ValidateRect(cLvwMer.hwnd, rc)

'刷 新ListView的内容,显示已经查出的记录数。
Call InvalidateRect(cLvwMer.hwnd, rc, True)

其中,rc的定义如下:
Public Type RECT                 '用来定义一个区域的坐标
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type VB的MSHFlexGrid控件不是很好用。 Call ValidateRect(cLvwMer.hwnd, rc)
Call GetClientRect(cLvwMer.hwnd, rc)
Call InvalidateRect(cLvwMer.hwnd, rc, True)
请教这三个怎么写代码 cLvwMer就是你要用的那个listview的名称啊
把这些代码放在数据导入开头,循环内部,以及结尾就可以了
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,