■控件显示样式
ListView控件可以用下面的四种形式显示信息。
大图标方式:每个项目都显示为大图标,图标下面的标签显示一定的文字信息。用户可以在该控件内拖动图标。
小图标方式:项目显示为小图标,并且每个项目的右边都有一个标签。用户也可以在视图内拖动选中的图标。
列表方式:项目显示为小图标,每个图标右边都有一个标签,并且按照一定的顺序以列优先方式显示,显示样式和上面的相同。
报表方式:项目以多栏列表显示,左边的栏显示图标和标签,用户可以根据自己的需要指定任意数量的附加栏并可以设定每个栏内显示的相应数据。
■典型编程
如何使用数据动态构建ListView控件、在不同的显示样式之间切换以及对选中对象进行处理,这是该控件最常用的三种编程情况。下面分别加以介绍。
该控件中显示的数据可以是静态的,在开发时就可以确定;也可以是动态的,需要根据用户的数据改变该控件的显示内容,这种情况更具有普遍性。如何根据用户的数据初始化该控件,这是该控件的一个非常典型的编程。编程思路和开发环境中的设定过程是相似的,也需要首先设定要添加项目的label,data以及要使用图标的索引号。下面是一段典型的编程:
ListViewItem llvi_cust
Int li_numrows,li_index
DataStore lds_cust
SetPointer(HourGlass!)
Lds_cust = Create datasotre
This.DeleteItems() //首先清除ListView中其他的项目
//为报表显示样式创建多个列
This.AddColumn("公司",Left!,700)
This.AddColumn("联系地址",Left!,500)
This.AddColumn("电话",Left!,400)
//检索数据
lds_cust.dataobject = "d_customer"
lds_cust.SetTransObject(SQLCA)
li_numrows = lds_cust.Retrieve()
//如果没有检索到数据则直接返回
If li_numrows <= 0 Then
Destroy lds_cust //释放DataStore对象的内存空间       
Return  //返回
End If
For li_index = 1 to li_numrows  //如果检索到了数据,对数据逐条处理
llvi_cust.label = lds_cust.Objectpany_name[li_index] + "~t" + &
lds_cust.Object.address[li_index] + "~t" + &
lds_cust.Object.phone[li_index] //项目标签
llvi_cust.data = lds_cust.Object.id[li_index] //项目的数据
llvi_cust.PictureIndex = 1 //项目的图片
This.AddItem(llvi_cust)  //添加该项目
Next
Destroy lds_cust //释放DataStore对象的内存空间
上面的脚本使用DataStore来提取数据,如果检索到数据,就将每条数据添加到ListView控件中,如果没有检索到数据就直接退出。添加项目到ListView时,首先为ListViewItem类型的变量赋值,包括label,data和pictureindex三项,赋值完毕后将该变量的值添加到ListView中。
如何在不同的显示样式之间进行切换?ListView控件的属性View是一个枚举类型的属性,通过修改该
属性使其取不同的值可以改变该控件的显示样式。可以使用的取值有:
ListViewSmallIcon!  表示以小图标样式显示。
ListViewLargeIcon!    表示以大图标样式显示。
ListViewList!  表示以列表样式显示。
ListViewReport!  表示以报表样式显示。
比如,可以设置多个命令按钮,不同的按钮被点击时都改变ListView的显示样式。在其中的“报表显示样式”按钮上可以编写如下脚本:
lv_1.View=ListViewReport!
当然,还可以在一个菜单的各个菜单项中编写脚本,当在ListView控件上使用鼠标右键时弹出该菜单。具体方式取决于开发人员的编程风格和用户的具体要求。
如何提取选中项目的内容?实际上显示样式只是一个表面问题,而提取选中项目的内容才是最终的目的。
应该首先判断哪个项目选中,然后再读取选中项目的数据。判断项目是否选中可以通过SelectedIndex函数、ListViewItem类型对象的Selected属性等来实现。读取指定项目的数据可以通过ListViewItem类型对象的Label和Data属性来获取。下面是一个最复杂的典型编程,该程序从一个允许同时选中多个项目的ListView控件中读取所有选中项目的标号和数据,脚本如下:
Int li_index
ListViewItem llv_item
For li_index = lv_1.SelectedIndex() To lv_1.TotalItems()
lv_1.GetItem (li_index,llv_item)
If llv_item.Selected Then
MessageBox("提示",String(li_index) + "是选中的~r~n标号:" + &
llv_item.label + "数据:" + String(llv_item.data))
End If
Next
上面的脚本首先定义一个ListViewItem类型的变量,使用GetItem将ListView的项目读取到该变量中,通过判断该变量的Selected来得知项目是否选中。函数SelectedIndex来获取第一个被选中的项目的索引号,循环直到处理完最后一个项目。在其他很多资料上都介绍的使用State函数循环处理多选ListView中的项目,实际上是行不通的。
另外,如果在ListView控件的相关事件中编程,可以直接使用事件的相关参数来获取选中的项目。比如,在DoubleClicked事件中编写脚本,读取用户双击项目的数据,并根据该数据做一定的处理,这也是一种比较常用的典型编程方法。下面是该事件中一段典型的脚本:
ListViewItem llv_item
This.GetItem(index,name)
SetPointer(HourGlass!)
Dw_1.Retrieve(llv_item.Label)
上面的脚本在用户双击选中ListView中的项目时读取该项目的标签,并以该标签作为参数检索其他的数据窗口。
【属性】
ListView属性
▲Visible
布尔类型的变量,表示ListView是否可见。该属性缺省为True。
▲Enabled
布尔类型变量,表示ListView是否可用。该属性缺省为True。
▲FixedLocations
布尔类型变量,表示用户是否可以拖动控件中的项目来改变其位置。该属性缺省为False
▲EditLabels
布尔类型变量,表示用户是否可以在控件中编辑项目的标签。该属性缺省为False。
▲AutoArrange
布尔类型,表示是否自动排列图标。该属性的缺省值为False。
▲ExtendedSelect
布尔类型,表示用户是否可以选择多个项目。该属性的缺省值为False,是一个非常重要的属性。
▲ButtonHeader
布尔类型,当为True时报表视图中的标题显示为按钮而不是标签,该属性的缺省值为True。
▲DeleteItems
允许用户使用Delete键删除列表中的项目。该属性缺省为False。
▲HideSelection
如果该属性为True,当控件失去焦点时,选中的项目不显示选中状态;如果该属性为False,当控件失去焦点时选中项目仍然显示为选中状态。该属性的缺省值为True。
▲LabelWrap
该属性设置项目的文字是否换行显示还是只在一行显示。该属性的缺省值为True,表示换行显示。
▲Scrolling
该属性表示控件是否可以该动显示其中的项目。缺省为True。
▲ShowHeader
表示标题是否显示在报表视图中。该属性缺省为True。
▲CheckBoxes
表示状态图片是否可以被CheckBox替代。如果设置该属性为True,则CheckBox缺省为非选中状态。该属性缺省为False。
▲TrackSelect
该属性可以指定当鼠标在项目上移动时是否以不同的颜表示。当该属性设置为True时,鼠标在项目上停留则以不同的颜表示,当停留一定时间后自动选中该项目。
▲OneClickActivate
表示鼠标单击是否激活ItemActivate事件。当该属性取值为True时,单击鼠标触发ItemActivate事件,并且鼠标位于某项目上时导致项目的颜改变(效果和TrackSelect相同)并且鼠标的形状为手型。
▲TwoClickActivate
表示鼠标双击是否触发ItemActivate事件。
▲GridLines
指定报表样式时是否显示网格线。该属性缺省为False。
▲HeaderDragDrop
该属性指定在报表样式中列头是否可以拖动来改变列的顺序。该属性缺省为False。
▲FullRowSelect
该属性指定在报表样式中是否选中整行的数据。该属性的缺省值为False。
▲UnderlineCode
当0neClickActive属性为True时,该属性有效。该属性指定没有选中的项目是否显示下划线,为True时表示显示。
▲UnderLineHot
不管0neClickActive还是TwoClickActivate属性为True,该属性都有效。该属性取值为True,表示Hot Tracking有效,并且高亮显示的项目带有下划线。该属性的缺省值为False。
▲Border
该属性指明ListView控件是否有边框,缺省值为True。
▲BorderStyle
枚举类型的属性,可以设定ListView控件的边框类型。当Border属性取值为True时该属性有效。缺省为StyleLower!。该属性的可用值有StyleBox!,StyleLowered!,StyleRaised!和StyleShadowBox!。
▲SortType
枚举
类型的属性,缺省值为Unsorted!,表示不进行排序。可以使用的值还有Ascending!(升序),Descending(降序),UserDefined!(用户定义)和Unsorted!(不排序)。
▲View
枚举类型的属性,表示该控件中的项目初始化时的显示样式,缺省值为ListViewLargeIcon!,为大图标显示。可以使用的值有ListViewLargeIcon!(大图标显示样式),ListViewSmallIcon!(小图标显示样式),ListViewList!(列表显示样式)和ListViewReport(报表显示祥式)。
▲Accelerator
为该控件定义快捷键。快捷键允许用户使用键盘选中某个项目,而不是使用鼠标。快捷健在项目标签的第一个字母下面显示下划线表示。
ListViewItem属性
ListView控件的结构比较复杂,使用该数据结构有助于简化对该控件的操作。该数据结构只有少数的函数,大部分时候使用该控件的属性来操作,或者是给该类型的数据赋值后将其插入到ListView控件中。
ListView控件最重要的数据结构ListViewItem,该结构用来保存ListView控件中每个项目的信息。它具有以下属性:
▲CutHighLighted
布尔类型属性,当该属性为True时项目高亮显示,并且是进行剪切操作的目标。
▲Data
any类型的属性,是和项目相关联的数据值。
▲DropHighLighted
布尔类型属性,该属性取值为True表示项目高亮显示,并且是拖放的目标。
▲HasFocus
布尔类型属性,该属性为True时表示项目在当前具有焦点。
▲ItemX
Integer类型的属性,该属性的取值是项目在ListView控件中的X坐标。
▲ItemY
Integer类型的属性,该属性的取值是项目在ListView控件中的Y坐标。
▲Label
String类型的属性,该属性的取值是项目文本标签中的内容。
▲OverlayPictureIndex
Integer类型的属性,其取值是覆盖图像列表中图片的索引号。
▲PictureIndex
Integer类型的属性,它的取值是项目图标的控件图像列表内的索引号。
▲Selected
布尔类型的属性,该属性取值为True时表示该项目是选中的。该属性是一个比较重要的属性,经常用来判断项目是否选中。
▲StatePictureIndex
Integer类型的属性,该属性的取值是控件状态图像列表中的索引号。
【事件】
◆BeginDrag
index
当用户在控件上单击鼠标并开始拖动时触发该事件
◆BeginLabelEdit
index
当用户单击选中的标签时或者调用相应的函数开始编辑标签时触发
◆BeginRightDrag
index
当用户在控件上单击鼠标右键并开始拖动时触发该事件
◆Clicked
index
当用户在控件上点击鼠标左键时触发该事件。当双击鼠标左键时也触发该事件
◆ColumnClick
column
当以报表样式显示并且ButtonHeader属性设置为True时该事件才有可能触发。当用户点击栏目标题时触发
◆Constructor
没有参数
excel listview控件
件创建时触发该事件。通常是在包含该控件的窗口触发窗口的Open事件之前触发该事件
◆DeleteAllItems
没有参数
当所有的项目删除时触发该事件
◆DeleteItem
index
当某一个项目被删除时触发该事件
◆Destructor
没有参数
当控件撤消时触发。通常是在窗口的Close事件触发之后紧跟着触发
◆DoubleClicked       
index
当用户双击控件时触发该事件
◆DragDrop
source、index
当用户拖动一个对象到控件上并松开鼠标放下该对象时触发
◆DragEnter
source
当用户拖动其他对象到该控件中时触发
◆DragLeave
source
当用户拖动对象并离开该控件时触发
◆DragWithin
source、index
当用户在控件中拖动对象时触发
◆EndLabelEdit
index、newlabel
当用户编辑完标签时触发
◆GetFocus     
没有参数
当控件获得焦点时触发
◆Help 
Xpos、Ypos
当控件获得当前焦点并且用户点击了F1键或者用其他方式要获取控件的帮助时触发
◆InsertItem
index
当在控件中插入新的项目时触发
◆ItemActivate
index
当单击或者双击项目时触发。触发时机还取决于控件OneClickActivate和 TwoClickActivate属性的设置
◆ItemChanged
index,focuschanged,hasfocus,  selectionchange,selected,otherchange
当控件中的项目改变时触发
◆ItemChanging
没有参数
当项目中的某些内容正处于变化过程中时触发。在该事件中可以返回1来防止改变
◆Key
key, keyflag
当用户点击了一个按钮时触发该事件
◆LoseFocus
没有参数
当控件失去焦点时触发
◆Other
wparam,iparam
当有其他系统信息而没有相应的PB映射消息时触发
◆RightClicked
index
当点击鼠标右键时触发该事件
◆RightDoubleClicked
index
当双击鼠标右键时触发该事件
◆Sort
index1,index2,column
当控件中的项目正在进行排序时触发
【函数】
★AddItem
该函数有两种语法格式,listviewname.AddItem(label, pictureindex),函数的功能是在listviewname中添加一个项目,项目的标签内容为label的内容,项目的图片索引号为pictureindex。另一个语法为:listviewname.AddItem ( item ),作用是将ListViewItem类型的项目添加到listviewname中,ListViewItem类型的变量item可以详细设置其属性的取值,使用这种格式的函数可以更详细地设置要添加项目的内容。
★AddLargePicture
该函数的作用是向ListView控件的大图标显示样式中添加位图、图标或者光标,该函数的语法为dlistviewname.AddLargePicture ( picturename )。
★AddSmallPicture
该函数的作用是向ListView中添加小图标显示样式时的图标、光标或位图,该函数的语法为listviewname.AddSmallPicture ( picturename )。
★AddStatePicture
该函数的作用是向ListView中添加状态图标时