没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2004-03-04 15:22:00.000|阅读 1483 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
ListView使用简介
ListView控件是VB开发者非常喜爱的控件之一。作为Windows95公共控件组(COMCTL32.OCX)
的成员,它经常与经常与TreeView、ImageList等控件联合使用。即用TreeView显示一个的树
型结构,而用ListView显示选中的节点(Node)对象的记录
集。
这是笔者在开发财务软件项目中的$#@60;$#@60;凭证管理$#@62;$#@62;模块的一个用户界
面。屏幕左边是一个TreeView控件,用来显示会计凭证的类别;右边是一个istView,用来显示
对应类别的凭证目录;上方是一个菜单条控件(MenuBar)和一个工具条控件(ToolBar);下方是
一个状态栏控件(StatusBar),用来显示凭证数个当前日期。
大家可以看到图中所 示的界面非常类似于Window95/98的资源浏览器,Windows的界面风格做为一种标准已为广大 用户所接受。而Windows操作系统的主要的优点就是为所有的应用程序提供了公用的界面。知道 如何使用基于Windows的应用程序的用户,很容易学会使用其他应用程序。
这种使 用Windows95公共控件组合的方法能够达到与Windows界面的一致性,所以在目前VB5.0应用 程序的开发中经常使用。
二、填充大量结果集所遇到的问题
在实际应用开发中,经常用ListView填充一个数据库结果集(Recordset)的内容。即先写
一段SQL查询语句,产生一个结果集,然后将结果集的每一条记录用DO...LOOP循环语句中填到ListView 中。
但是当结果集很大时(例如有5000条以上的记录),填充所需要的时间会很长。 用户不得不等很长时间完成一个查询。所以在查询的过程中必须允许用户按Escape键退出。具 体做法是在DO...LOOP循环体中加一条DoEvents函数,并写一段中断退出程序代码。
DoEvents函数的功能是:转让控制权,以便让操作系统处理其它的事件。这样在长时间的查询 过程中,如果用户按了Escape键,将退出循环体,结束查询过程。
但是这样又会引 发另外一个问题:由于DoEvents可以让操作系统响应别的事件,循环体中填充每一条ListView 项目(ListItem)的过程也会显示出来,所以在填充的过程中屏幕会不停的闪动,这种现象当然 不能被用户所接受。如何解决这个问题呢?
三、解决方案
用WindowsAPI函数可以解决这个问题。首先对几个用到的API函数做一解释和说明。
1.GetClientRectLib"user32"(ByValhwndAsLong,lpRectAsRECT)As Long
此函数的功能是获得一个指定对象窗 Window)的矩型框区域(rectangle)。
Hwnd为指定对象或窗体的句柄。LpRect为返回矩型框的结构(必须定义为结构类型的变量)。
2.ValidateRectLib"user32"(ByValhwndAsLong,lpRectAsRECT)As Long
此函数的功能是使指定的矩型区域生效。这样会通知Windows不必对指定 的区域进行重画(Redraw)。
3.InvalidateRectLib"user32"(ByVal hwndAsLong,lpRectAsRECT,ByValbEraseAsLong)AsLong
此函数的 功能是使指定的矩型区域无效。这样会通知Windows要对指定的区域进行重画。
具体实现的步骤如下:
1.在填充结果集之前先用GetClientRect函数获得ListView的 显示区域。
2.在增加完一个显示项目(ListItem)后用ValidateRect函数置这一 区域为有效。这样Windows就不会显示每一条ListItem,屏幕闪动的现象就会消失。
3.在填充结果集之后,用InvalidateRect函数置这一区域为无效。这样Windows就会重画ListView 的内容,结果集被完整的显示出来。
下面是笔者在项目开发中的一个程序实例。程 序名为FillListView。该程序将填写一个Access数据库(FISCAL.MDB)的凭证表(Table)的内容 到ListView中。
首先进入VB5.0,新建一个窗体(Form),名为Form1。
然后在Form中增加下列控件。
控件名Name
ListViewLvw
ImagelistimlList
CommandButton。Command1
将ImageList控件中充填一个名为“item”的图象后与ListView控件关联。
在$#@60;$#@60;工程$#@62;$#@62;菜单命令条中进入“引用”对话框,选择“MicrosoftDAOObjectLibrary”
在Form的通用模块(Modle)中定义以下变量。
PrivateTypeRECT用来定义一个区域的坐标。
LeftAsLong
TopAsLong
Right AsLong
BottomAsLong
EndType
--
Windows API函数的声明。
PrivateDeclareFunctionInvalidateRectLib"user32"
(ByVal hwndAsLong,lpRectAsRECT,ByValbEraseAsLong)AsLong
PrivateDeclare FunctionValidateRectLib"user32"
(ByValhwndAsLong,lpRect AsRECT)AsLong
PrivateDeclareFunctionGetClientRectLib"user32"
(ByVal hwndAsLong,lpRectAsRECT)AsLong
DimmbSearchCancelAsBoolean
用来定义查询中断的标志。
True表示中止查询;False表示正在查询。
将该Form的KeyPreview属性设为True,以控制窗体接收键盘事件。
然后在Form 的KeyPress事件中写下列代码:
IfKeyAscii=vbKeyEscapeThen
mbSearchCancel=True
当用户按Escape 键时,置mbSearchCancel变量为True。
EndIf
表示结束查询。
在Command Button的Click事件中调用填充子程序:CallFillListView。
子程序的代码 为:
PrivateSubFillListView()
DimitmXAsListItem定义一 个ListView的显示项目。
DimsSQLAsString查询字串变量。
Dim rcAsRECTListView的显示区域。
DimwrkJetAsWorkspace数据库工作空间。
Dim dbFISCALAsDatabase数据库对象。
DimRSAsRecordset数据结果集。
On ErrorGoToErrFillListView
Screen.MousePointer=vbHourglass
lvw.ListItems.Clear: 清除ListView的内容。
定义ListView的列头的名称。
With lvw.ColumnHeaders
.Add,,"凭证编号",800
.Add,," 凭证日期",1000
.Add,,"凭证字号",1000
.Add,," 凭证类别",800
.Add,,"首行摘要",1440
.Add,," 借方金额合计",1000,lvwColumnRight
EndWith
- --
产生查询语句。
sSQL="selectvoucher_id,voucher_number,voucher_date,
voucher_type_shortname,"
sSQL=sSQL&"voucher_type_name,voucher_memo,voucher_amount fromVOUCHER"
sSQL=sSQL&"orderbyvoucher_number"
---
打开一个数据库结果集。
SetwrkJet=CreateWorkspace("NewJetWorkspace", "admin","",
dbUseJet)
SetdbFISCAL=wrkJet.OpenDatabase("FISCAL.mdb")
Set RS=.dbFISCAL.OpensSQL,dbOpenForwardOnly
获得listview 的显示区域。
CallGetClientRect(lvw.hwnd,rc)
DoWhileNotRS.EOF()
DoEvents
If mbSearchCancelThen
中断退出
RS.Close:SetRS=Nothing关闭、清 除结果集。
mbSearchCancel=False
Screen.MousePointer=vbDefault
--
刷新ListView的内容,显示已经查出的记录数。
CallInvalidateRect(lvw.hwnd, rc,True)
ExitSub
EndIf
---
增加一个显示 项目ListItem。
Withlvw.ListItems
SetitmX=.Add(,,""& RS!voucher_number,"item","item")
凭证编号
itmX.SubItems(1) =Format$(""&RS!voucher_date,"yyyy/mm/dd")
凭证日期
itmX.SubItems(2)=""&RS!voucher_type_shortname &"-"—
凭证字号
&""&RS!voucher_number
itmX.SubItems(3)="" &RS!voucher_type_name
凭证类别
itmX.SubItems(4)=""&RS!voucher_memo
首行摘要
itmX.SubItems(5)=Format$(""&RS!voucher_amount, "#,###.00")
借方合计金额
itmX.Tag=""& RS!voucher_id
EndWith
--
避免显示区域的闪动现象。
Call ValidateRect(lvw.hwnd,rc)
RS.MoveNext
Loop
- 刷新ListView的内容。显示所有查出的记录数。
CallInvalidateRect(lvw.hwnd,rc, True)
-
关闭、清除结果集。
RS.Close:SetRS=Nothing
creen.MousePointer =vbDefault
ExitSub
ErrFillListView:
Screen.MousePointer= vbDefault
MsgBoxErr&":"&Error,vbInformation,Me.Caption
Exit Sub
EndSub
编写完毕后按F5执行该程序,用鼠标点击CommandButton,将 开始查询并填写凭证的内容到ListView中去。
关于ListView本文只是描述了它 如何填充大量结果集的方法,它还有很多特性(property)和方法(method),利用它们可以达到
更完美的显示效果,有兴趣的读者可以进一步研究。不管是开发什么样的应用程序,只有坚持 面向用户、方便用户的原则,这样的软件才具有强大的生命力。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号