VBListView控件用法.docx
- 文档编号:24543307
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:12
- 大小:22.13KB
VBListView控件用法.docx
《VBListView控件用法.docx》由会员分享,可在线阅读,更多相关《VBListView控件用法.docx(12页珍藏版)》请在冰豆网上搜索。
VBListView控件用法
VBListView控件用法集合
ListView控件比前面几种控件要复杂一些,通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。
ListView控件是由ColumnHeader和ListItem对象所组成的,其中ColumnHeader对象的个数决定了控件的列数,而ListItem对象的个数则决定了控件的行数。
(图7)
ColumnHeader对象是ListView控件中包含标头文字的项目。
利用ColumnHeader对象,用户可以:
▲单击对象触发ColumnClick事件并根据数据项目将项目排序。
▲拖动对象的右边框来调整列宽度。
▲在报表视图中隐藏ColumnHeader对象。
ColumnHeader对象的数目决定每个ListItem对象可包含的子项目数目。
删除ColumnHeader对象后所有与列关联的子项目也将被删除,并且每个ListItem对象的子项目数组将平移以更新ColumnHeader的索引,而这将导致剩余的列标头SubItemIndex属性的改变。
ColumnHeader对象的SubItemIndex属性
该属性返回与ListView控件中ColumnHeader对象关联的子项目的索引。
子项目是字符串数组,代表显示在报表视图中的ListItem对象的数据。
第一列的列标头SubItemIndex属性设置为0,这是因为小图标和ListItem对象的文字总出现在第一列中,而且它们被当作ListItem对象而不是子项目。
列标头数目取决于子项目数目。
列标头数目总是比子项目数目多1。
在设计时可以利用属性页的“列首”选项卡将ColumnHeader对象添加到ListView控件中,在运行时则用Add方法添加。
ColumnHeader对象的Add方法
该方法的使用与前面那些控件基本相似,就不再介绍了。
ListView1.ColumnHeader.Add(index,key,text,width,alignment)
ListItem对象是指控件中的一行(不包含标头行)的所有内容。
它也可包含文本和图片,但是要使用图片则必须通过Icons和SmallIcons属性引用ImageList控件。
ListItem对象的SubItems属性
返回或设置一个字符串(子项目)数组,它代表ListView控件中ListItem对象的数据。
ListItem对象可包含任意多个的关联项目数据字符串(子项目),但每个ListItem对象子项目数目必须相同。
每个子项目都对应于相关的列标头,无法直接向子项目数组添加元素,只有通过ColumnHeaders的Add方法添加列标头的方法来添加子项目。
ListItem对象的Add方法
该方法添加ListItem对象到ListView控件的ListItems集合中并返回对新创建对象的引用。
它的语法如下:
ListItem1.Add(index,key,text,icon,smallIcon)
ListView控件的View属性
ListView控件可使用四种不同视图显示项目,这可以用View属性来确定。
该属性返回或设置ListView控件中ListItem对象的外观。
ListView控件的SortOrder,SortKey和Sorted属性
控件中的ListItem对象可以按要求进行排序,与排序有关的属性是SortOrder,Sorted和SortKey属性。
SortOrder属性返回或设置一个值,此值决定ListView控件中的ListItem对象以升序或降序排序。
SortKey属性返回或设置一个值,此值决定ListView控件中的ListItem对象如何排序。
Sorted属性返回或设置确定ListView控件中的ListItem对象是否排序的值。
下面的代码说明了如何创建ColumnHeaders和ListItem对象,SubItemIndex和SubItem属性的使用方法以及如何排序。
PrivateSubForm_load()
'确保ListView控件的view属性为报表视图。
ListView1.View=lvwReport
'添加三列。
ListView1.ColumnHeaders.Add,"Name","姓名"
ListView1.ColumnHeaders.Add,"Sex","性别"
ListView1.ColumnHeaders.Add,"Age","年龄"
'向控件添加ListItem对象。
DimitmXAsListItem
'添加column1的名称。
SetitmX=ListView1.ListItems.Add(1,"ZL","张力")
'使用SubItemIndex将SubItem与正确的ColumnHeader关联。
使用关键字("Sex")指定正确的ColumnHeader。
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
'使用ColumnHeader关键字将SubItems字符串与
'正确的ColumnHeader关联。
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="19"
SetitmX=ListView1.ListItems.Add(1,"LF","李芳")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="22"
SetitmX=ListView1.ListItems.Add(1,"WW","王伟")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="24"
EndSub
PrivateSubListView1_ColumnClick(ByValColumnHeader AsComctlLib.ColumnHeader)
SelectCaseColumnHeader.Key
Case"Sex":
ListView1.SortKey=1
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
Case"Age":
ListView1.SortKey=2
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
EndSelect
EndSub
七、带刻度滑块---Slider
Slider控件是一个包含滑块和可选择性刻度标记的窗口,可以通过拖动滑块,用鼠标单击滑块的任意一侧或者使用键盘移动滑块来选择一个值。
在选择离散数值或某个范围内的一组连续数值时,Slider控件十分有用。
例如,无需键入数字,通过将滑块移动到刻度标记处,可以用Slider控件来输入数值。
Silder控件的大多数基本属性比较简单,我们这里重点介绍一些较有用而又常易忽略的属性。
TickStyle属性
该属性返回或设置Slider控件上显示的刻度标记的样式。
SelectRange,SelStart和SelLength属性
Slider控件可以选择某个范围内的数值,这就要用到SelectRange,SelStart和SelLength属性。
SelectRange属性决定Slider控件是否可以选择一个范围。
如果SelectRange属性为True,SelStart为选定范围的起始值,SelLength为选定范围的长度。
如果SelectRange属性为False,则SelStart属性的设置值与&#118alue属性的设置值相同,SelLength属性无效。
下列代码允许在按住SHIFT键时,用鼠标拖动或单击Slider控件以选择一个范围。
PrivateSubForm_Load()
'设置slider控件的设置值
Slider1.Max=20
EndSub
PrivateSubSlider1_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfShift=1Then'如果按住Shift键,则Slider1.SelectRange=True'打开SelectRange。
Slider1.SelStart=Slider1.&#118alue'设置SelStart数值
Slider1.SelLength=0'设置先前的SelLength(如存在)为0。
EndIf
EndSub
PrivateSubSlider1_MouseUp(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
ifShift=1Then
'如果在一点决定返回上一步,将发生错误。
OnErrorResumeNext
'否则使用SelStart和当前数值设置SelLength。
Slider1.SelLength=Slider1.&#118alue-Slider1.SelStart
Else
Slider1.SelectRange=False'如果松开SHIFT键。
EndIf
EndSub
在程序中,常用Slider控件来代替键盘输入数字,如下面的例子。
该例通过Slider控件来显示不同的长度。
PrivateSubForm_Load()
Slider1.Min=0
Slider1.Max=50
Slider1.SmallChange=1
Slider1.LargeChange=10
Slider1.TickFrequency=5
EndSub
PrivateSubSlider1_Change()
Label1.Caption="长度是"&Format(Slider1.&#118alue/5,"#.00")&"厘米"
EndSub
==================
一、ListView使用简介
ListView控件是VB开发者非常喜爱的控件之一。
作为Windows95公共控件组(COMCTL32.OCX)的成员,它经常与经常与TreeView、ImageList等控件联合使用。
即用TreeView显示一个的树型结构,而用ListView显示选中的节点(Node)对象的记录集。
这是笔者在开发财务软件项目中的<<凭证管理>>模块的一个用户界面。
屏幕左边是一个TreeView控件,用来显示会计凭证的类别;右边是一个ListView,用来显示对应类别的凭证目录;上方是一个菜单条控件(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)AsLong
此函数的功能是获得一个指定对象窗口(Window)的矩型框区域(rectangle)。
Hwnd为指定对象或窗体的句柄。
LpRect为返回矩型框的结构(必须定义为结构类型的变量)。
2.ValidateRectLib"user32"(ByValhwndAsLong,lpRectAsRECT)AsLong
此函数的功能是使指定的矩型区域生效。
这样会通知Windows不必对指定的区域进行重画(Redraw)。
3.InvalidateRectLib"user32"(ByValhwndAsLong,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控件关联。
在<<工程>>菜单命令条中进入“引用”对话框,选择“MicrosoftDAOObjectLibrary”
在Form的通用模块(Modle)中定义以下变量。
PrivateTypeRECT'用来定义一个区域的坐标。
LeftAsLong
TopAsLong
RightAsLong
BottomAsLong
EndType
' --
'WindowsAPI函数的声明。
PrivateDeclareFunctionInvalidateRectLib"user32"
(ByValhwndAsLong,lpRectAsRECT,ByValbEraseAsLong)AsLong
PrivateDeclareFunctionValidateRectLib"user32"
(ByValhwndAsLong,lpRectAsRECT)AsLong
PrivateDeclareFunctionGetClientRectLib"user32"
(ByValhwndAsLong,lpRectAsRECT)AsLong
DimmbSearchCancelAsBoolean
'用来定义查询中断的标志。
'True表示中止查询;False表示正在查询。
将该Form的KeyPreview属性设为True,以控制窗体接收键盘事件。
然后在Form的KeyPress事件中写下列代码:
IfKeyAscii=vbKeyEscapeThen
mbSearchCancel=True
'当用户按Escape键时,置mbSearchCancel变量为True。
EndIf
'表示结束查询。
在CommandButton的Click事件中调用填充子程序:
CallFillListView。
子程序的代码为:
PrivateSubFillListView()
'
DimitmXAsListItem'定义一个ListView的显示项目。
DimsSQLAsString'查询字串变量。
'
DimrcAsRECT'ListView的显示区域。
DimwrkJetAsWorkspace'数据库工作空间。
DimdbFISCALAsDatabase'数据库对象。
DimRSAsRecordset'数据结果集。
OnErrorGoToErrFillListView
Screen.MousePointer=vbHourglass
lvw.ListItems.Clear:
'清除ListView的内容。
'
'定义ListView的列头的名称。
Withlvw.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_amountfromVOUCHER"
sSQL=sSQL&"orderbyvoucher_number"
'' ---
'打开一个数据库结果集。
SetwrkJet=CreateWorkspace("NewJetWorkspace","admin","",dbUseJet)
SetdbFISCAL=wrkJet.OpenDatabase("FISCAL.mdb")
SetRS=.dbFISCAL.OpensSQL,dbOpenForwardOnly
'
'获得listview的显示区域。
CallGetClientRect(lvw.hwnd,rc)
DoWhileNotRS.EOF()
DoEvents
IfmbSearchCancelThen
'中断退出
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
' --
'避免显示区域的闪动现象。
CallValidateRect(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
ExitSub
EndSub
编写完毕后按F5执行该程序,用鼠标点击
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VBListView 控件 用法