VB ListView的使用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 属性的使用方法以及如何排序。
Private Sub Form_load()'确保ListView控件的view属性为报表视图。
ListView1.View=lvwReport'添加三列。
ListView1.ColumnHeaders.Add,"Name","姓名"ListView1.ColumnHeaders.Add,"Sex","性别"ListView1.ColumnHeaders.Add,"Age","年龄"'向控件添加ListItem对象。
Dim itmX As ListItem'添加column1的名称。
Set itmX=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"Set itmX=ListView1.ListItems.Add(1,"LF","李芳")itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="22"Set itmX=ListView1.ListItems.Add(1,"WW","王伟")itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="24"End SubPrivate Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader) Select Case ColumnHeader.KeyCase "Sex":ListView1.SortKey=1ListView1.SortOrder=lvwAscendingListView1.Sorted=TrueCase "Age":ListView1.SortKey=2ListView1.SortOrder=lvwAscendingListView1.Sorted=TrueEnd SelectEnd Sub一、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填充一个数据库结果集(Record set)的内容。
即先写一段SQL查询语句,产生一个结果集,然后将结果集的每一条记录用DO...LOOP循环语句中填到ListView中。
但是当结果集很大时(例如有5000条以上的记录) ,填充所需要的时间会很长。
用户不得不等很长时间完成一个查询。
所以在查询的过程中必须允许用户按Escape键退出。
具体做法是在DO...LOOP循环体中加一条DoEvents函数,并写一段中断退出程序代码。
DoEvents函数的功能是:转让控制权,以便让操作系统处理其它的事件。
这样在长时间的查询过程中,如果用户按了Escape键,将退出循环体,结束查询过程。
但是这样又会引发另外一个问题:由于DoEvents 可以让操作系统响应别的事件,循环体中填充每一条ListView项目(ListItem)的过程也会显示出来,所以在填充的过程中屏幕会不停的闪动,这种现象当然不能被用户所接受。
如何解决这个问题呢?三、解决方案用WindowsAPI函数可以解决这个问题。
首先对几个用到的API函数做一解释和说明。
1.GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long此函数的功能是获得一个指定对象窗口(Window) 的矩型框区域(rectangle)。
Hwnd为指定对象或窗体的句柄。
LpRect为返回矩型框的结构(必须定义为结构类型的变量)。
2.ValidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long此函数的功能是使指定的矩型区域生效。