主题:再问一江秋水
greatmenddc
[专家分:0] 发布于 2008-08-18 13:13:00
谢谢你此前给我的帮助,现在关于这段程序还有点不懂之处请教,我看不懂响应Command1_Click()事件后是如何实现自动换行的,是否ListView控件有自动换行的属性设置?另外想要删除选中的一行应该怎么做?
Private Sub Command1_Click()
i=i+1
ListView1.ListItems.Add , , i '添加 ListView1第1列
ListView1.ListItems(i).SubItems(1) = "abc" '添加 ListView1第2列
ListView1.ListItems(i).SubItems(2) = "def" '添加 ListView1第3列
ListView1.ListItems(i).SubItems(3) = "ghi" '添加 ListView1第4列
ListView1.ListItems(i).SubItems(4) = "jkl" '添加 ListView1第5列
End Sub
回复列表 (共6个回复)
沙发
一江秋水 [专家分:9680] 发布于 2008-08-18 17:10:00
非也,ListView控件没有自动换行的属性。这是用行数 i 来控制的。
看来你正在学ListView控件,特贴上以下资料供你参考:
ListView控件的使用方法
ListView控件包括ListItem对象和ColumnHeader对象。
本人简单理解为:ListItem对象看成数据行;ColumnHeader对象看成列标题。
ListItem对象(行)有两部分:一部分是图标和简要描述的文本(第1列);另一部分是前者的子
项文本信息(第2列,第3列......)。
而ListItems即是对ListItem对象集合(所有行)的引用。 故此
ListItems(1) 可以表示为第1行
Listitems(1).text 返回/设置 第1行第1列的文本值(注:清空后不能用此办法设置)
Listitems(1).subItem(1) 返回/设置 第1行第2列的文本值
【常用属性】
[1]view属性
该属性有4个值可设定:
1---小图标视图显示
2---列表
3---报表
0---无图标(默认)
[2]AllowColumnReorder属性
设置为True时,用户可以用鼠标选中1列拖至其他地方进行重新排列。
[3]Checkboxes属性
设置为True时,每一行数据前将显示一复选框。
[4]FlatScrollBar属性
设置为Felse时控件将显示滚动条。
[5]FullRowSelect属性
设置为True时可以整行地选择数据。
[6]GridLines属性
设置为True时控件将显示网格线。(只作用于“报表”视图)
[7]HideColumnHeaders属性
设置为Felse时,列标题可视,反之则不可视。
[8]HotTracking属性
设置为True时,鼠标所在行将以高亮度显示。
[9]Icons,SmallIcons属性
两者设置ListView控件视图相关联的ImageList控件中的图片。
Icons指明视图为大图标时的关联;
SmallIcons指明视图为小图标时的关联。
[10]LabelWrap属性
设置为True时,文本标签超出列宽时可换行。
[11]SelectedItem属性
返回对所选ListItem对象(行)的引用。
[12]Sorted属性
当值为True时,列表按字母排序。
[13]Picture属性
指定控件的背景图片,此属性在控件自带属性设置框里设置。
【常用方法】
[1]Add方法
添加ListItem对象(行)到控件中。
语法格式:
控件ListItems集合.add(index,key,text,icon,smallIcon)
[2]FindItem方法
查找并返回对控件中ListItem对象的引用。
语法格式:
控件名.FindItem(string,value,index,match)
新建一表单,在表单里拖出一个ListView控件和一个ImageList控件。
选中ListView控件,单击右键,选择“ListViewCtrl Properties”,在General页面框中选中下列复选框:
LabelWrap:文本可换行
Checkboxes:显示复选框
FullRowSelect:整行选定
清除FlatScrollBar的选定,控件将显示滚动条。
**************************************************************
控件 name属性
ListView view1
ImageList Image1
***************************************************************
在表单的Init事件中加入下列代码:
&&&&将ImageList控件图片赋予ListView控件&&&&
thisform.view1.Icons=thisform.Image1.object
thisform.view1.smallIcons=thisform.Image1.object
****************************************************************
在ListView控件init事件中加入下列代码:
&&&初始化ListView控件&&&&
&&设置显示为报表视图
this.view=3
&&添加和设置列标
store this.ColumnHeaders.Add(,"l11","序号",this.Width/7) to clm1
store this.ColumnHeaders.Add(,"l12","物资编号",this.width/4) to clm2
store this.ColumnHeaders.Add(,"l13","存货名称",this.Width/4) to clm3
store this.ColumnHeaders.Add(,"l14","规格",this.width/4) to clm4
store this.ColumnHeaders.Add(,"l15","计量单位",this.Width/8) to clm5
store this.ColumnHeaders.Add(,"l16","请购数量",this.width/4) to clm6
store this.ColumnHeaders.Add(,"l17","使用日期",this.Width/4) to clm7
store this.ColumnHeaders.Add(,"l18","请购用途",this.width/4) to clm8
this.hottracking=True &&鼠标停留行高亮度显示
******************************************************************
将数据表添加到ListView控件中显示:
新建一表单方法程序 refresh_grid,可随时调用刷新数据。
在其中加入下列代码:
L1=thisform.view1
L1.ListItems.clear &&清除数据
sele 请购表
scan
&&添加ListItem对象第1列图标和文本。
store L1.ListItems.Add(,,序号,,1) to bbb
&&添加第2,3...列文本
store alltrim(物资编号) to bbb.subitems(1)
store alltrim(存货名称) to bbb.subitems(2)
store alltrim(规格) to bbb.subitems(3)
store alltrim(计量单位) to bbb.subitems(4)
store 请购数量 to bbb.subitems(5)
store 使用日期 to bbb.subitems(6)
store alltrim(请购用途) to bbb.subitems(7)
endscan
注:若字段值为.null.时,添加时将出现错误提示。
请自行设置用函数加以判别。为.null.时可以空值添加。
板凳
一江秋水 [专家分:9680] 发布于 2008-08-18 17:13:00
如何返回选定值:
L1=thisform.view1
L1.selectedItem.text &&返回选定行第1列文本值
L1.selectedItem.index &&返回选定行的位置
L1.ListItems(x).subItems(y) &&返回第x行,第y+1列文本值
*****
如何用用命令设置复选框状态:
thisform.view1.ListItems(x).checked=True
&&第x行复选框选定
******************************************
选定复选框时发生的事件itemcheck:
LPARAMETERS item
if item.checked=True&&判定当复选框选中
要执行的语句
else
要执行的语句
endif
******
&&清除所有数据
thisform.view1.ListItems.clear
&&清除选定行
L1=thisform.view1
L1.Listitems.remove(L1.selectedItem.index)
****
得知所有行的总数:
L1.Listitems.count
如何发送消息来获得当前选择iItem?
LVM_GETNEXTITEM消息,指定wParam为-1,lParam为LVNI_SELECTED就行了。如果选择了很多项,那发送
消息后eax中保存的是当前选择项目的Index,那再次发送LVM_GETNEXTITEM消息时wParam指定为这个
Index就可以获得下一个
普通用法==================
x = ListView1.ListItems.Add(, "F", "哈哈哈", 1)
x = ListView1.ListItems.Add(, "k", "呵呵呵", 2)
ListView1.Sorted = True '锁定
ListView1.GridLines = True '显示网格行
ListView1.StartLabelEdit '编辑字符
排序方法==================
ListView1.SortOrder = lvwDescending '采用降序
ListView1.SortKey = ColumnHeader.index - 1
ListView1.Sorted = True
例子
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
ListView1.SortOrder = lvwAscending
Select Case ColumnHeader.Index
Case 1
ListView1.SortKey = a
ListView1.Sorted = True
Case 2
ListView1.SortKey = 1
ListView1.Sorted = True
End Select
End Sub
'x = ListView1.ListItems.Add(, 关键字, 名称, 图象)
ListView1.SelectedItem = ListView1.ListItems.Item(2)
msgbox ListView1.SelectedItem.Icon 判断用户选择了哪个
msgbox ListView1.SelectedItem.SmallIcon
ListView1.SelectedItem = ListView1.ListItems.Item(ListView1.SelectedItem.Index + 1)
ListView1.SetFocus
ListView1.SelectedItem.Icon = 3 ' 更改ICO
实现双击==================
有时侯你的鼠标并没有在指定的图标上双击但是出现了双击效果,下面一段
代码可以解决问题
Dim bodbclick As Boolean
Private Sub ListView1_DblClick()
If bodbclick = False Then Exit Sub
MsgBox "你选中了"
End Sub
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
bodbclick = True
End Sub
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
bodbclick = False
End Sub
搜索指定 字符=============
'选中
Dim itmFound As ListItem
Set itmFound = ListView1.FindItem("关键字", lvwText, , lvwPartial)
'Set itmFound = ListView1.FindItem("44")
If itmFound Is Nothing Then
MsgBox "没找到"
Exit Sub
Else
itmFound.EnsureVisible
itmFound.Selected = True
ListView1.SetFocus
End If
判断多重选择==============
List1.Clear
For i = 1 To 21
If ListView1.ListItems.Item(i).Selected = True Then
List1.AddItem i - 1
End If
Next i
判断 checkbox=============
ListView1.ListItems.Item(1).Checked = True
ListView1.ListItems.Item(2).Checked = True
ListView 控件通常用于显示表示项目以及项目文本的图形图标。此外,ListView 控件还可以用于
显示有关子项目中项目的其他信息。例如,如果ListView 控件显示一列文件,您可以配置 ListView控
件来显示作为子项目的诸如文件大小和属性的详细信息。要显示 ListView 控件中的子项目信息,必须
将 View 属性设置为 View.Details。此外,您必须创建 ColumnHeader 对象并将这些对象分配给
ListView 控件的 Columns 属性。在设置这些属性后,项目以行和列格式进行显示,类似于 DataGrid
控件。以这种方式显示项目的能力使 ListView 控件为从任意类型的数据源显示数据提供了快速、简便
的解决方案。
如你所知,ListView控件提供了一个非常好的方式关联图标、图片到条目。这个控件使得编程选择
列表中的条目变得容易。但是,正因为Visual Basic选择了一个条目,并选定的条目并不总是可以让用
户看到。例如,如果你有很多条目显示在控件中,你可以需要使用滚动条来显示在列表末尾的条目。幸
运的是,ListView控件使得编程滚动到选中的条目也变得容易。列表中的每个条目都有EnsureVisible
方法。正如你所期望的,当你调用这个方法,它会强制控件显示该条目于ListView的可见区域。
为了演示这点,放一个ListView控件到窗体,然后右点控件并从菜单中选择“属性”。修改控件的
View属性为3 - lvwReport。接着,点击Column Headers标签,点击Insert Column按钮,在文本域中
输入“Which Foo?”。点击确认按钮。
最后,添加以下代码:
Private Sub Form_Load()
Dim x As Integer
With ListView1
For x = 1 To 20
.ListItems.Add Key:="foo" & x, Text:="foo" & x
Next x
.SelectedItem = .ListItems("foo20")
.SelectedItem.EnsureVisible
End With
End Sub
当你运行这个工程,Visual Basic将打开窗体,然后显示列表中的第20个条目。
3 楼
一江秋水 [专家分:9680] 发布于 2008-08-18 17:14:00
如何获取多选的总行数?
没有现成的属性,你只能遍历整个 ListItems,检查每个 ListItem 的 Selected 属性。使用下面
的代码:
Dim i, nCount, nFirst, nLast
nCount = 0
nLast = 0
nFirst = ListView1.ListItems.Count + 1
For i = 1 To ListView1.ListItems.Count
If ListView1.ListItems(i).Selected Then
nCount = nCount + 1
If nFirst > i Then
nFirst = i
End If
If nLast < i Then
nLast = i
End If
End If
Next
If nCount Then
MsgBox "选中" + CStr(nCount) + "个条目!" _
+ vbCrLf + "第一个选中的为" + CStr(nFirst) + _
vbCrLf + "最后一个为" + CStr(nLast)
Else
MsgBox "没有选中条目!"
End If
如果 listview 中的 item 太多那么遍礼一次会很浪费时间,建议使用 sendmessage 发
送 LVM_GETSELECTEDCOUNT 消息来获得选定的数目。
如何获得CheckBox的选择状态?
利用 SendMessage 发送消息 LVM_GETITEMSTATE 获得状态 :
r = SendMessage(ListView1.hwnd, LVM_GETITEMSTATE, i, LVIS_STATEIMAGEMASK)
If r And &H2000& Then
' 如果返回值为 &H2000,就说明 Checkbox 被选中 。
End If
如何判断是否在空白处双击?
你可以在双击事件中使用ListView的HitTest来判断鼠标到底点在哪个条目上了。如果双击的是空
白处,这个方法返回的是空。
如何判断双击位置?
将窗体的 ScaleMode 设置为 Pixels。
在 DblClick 事件中先使用 API 函数 GetCursorPos 得到鼠标位置,然后利用 ScreenToClient
将其转换为窗口坐标。然后利用 ListView 的 HitTes 方法判断是否点击到某个 Item上。
如何按数字排序?
ListView默认是按照文字排序,如果要按照数值排序,一个是将Sorted属性设为False,而自己编
写一个排序程序做这件事。另一个办法是利用Windows API的 LVM_SORTITEMS 消息来指定自己的一个比
较大小的函数来取代 ListView 默认的函数。
在点击数字列头的事件中,首先将数字变一下格式,将列的内容变为:
format(列的内容,"000000000000")
再将 listview 控件的索引值设为 TRUE,最后将列的内容改回来 val(列的内容)。'在form上加
listview1控件,view值设为3,加上下面一段程序:
Private Sub Form_Load()
ListView1.ColumnHeaders.Add , , "Size"
For i = 1 To 100
ListView1.ListItems.Add , , Int(Rnd * 10000)
Next
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
Dim i As Integer
ListView1.SortKey = ColumnHeader.Index - 1
'以 下 是 按 SIZE排 序 的 程 序
If ColumnHeader.Text = "Size" Then
For i = 1 To ListView1.ListItems.Count
ListView1.ListItems(i).Text = Format(ListView1.ListItems(i).Text, "000000000000")
Next
If ListView1.SortOrder = lvwDescending Then
ListView1.SortOrder = lvwAscending
Else
ListView1.SortOrder = lvwDescending
End If
ListView1.Sorted = True
For i = 1 To ListView1.ListItems.Count
ListView1.ListItems(i).Text = Val(ListView1.ListItems(i).Text)
Next
End If
End Sub
如何捕获滚动事件?
对于以报表方式显示的 ListView 控件,利用 SendMessage 函数发送 LVM_GETTOPINDEX 消息以获
得控件当前位于 ListView 视图内最顶端的 Item在ListView 中的索引。如果滚动了ListView,该值会
改变,你可以使用一个笨办法,利用一个 Timer 控件,每一段时间发送LVM_GETTOPINDEX 消息,这样
就可以得知 ListView 是否被滚动,下面是一个范例。
Option Explicit
Const LVM_FIRST = &H1000
Const LVM_GETTOPINDEX = (LVM_FIRST + 39)
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Private Sub Command1_Click()
Debug.Print SendMessage(ListView1.hwnd, LVM_GETTOPINDEX, 0, 0)
End Sub
Private Sub Form_Load()
Dim x As ListItem
Dim i As Integer
For i = 1 To 20
Set x = ListView1.ListItems.Add(, , "Item" + Str(i))
Next i
End Sub
点击 Command1就可以得到当前位于 ListView视图内最顶端的 Item在 ListView中的索引。
可以使用ListView1.SelectedItem.Index获得当前行。但没有办法获得当前列。
i=条目编号(行,从1开始计数),j=字段编号(列,从1开始计数)
①ListView1.ListItems.count: 取得条目总数
②ListView1.ListItems(i).text: 取得指定第 i 行第 1 列的文本
③ListView1.ListItems(i).SubItems(j): 取得/设置指定第 i 行第 j+1 列的文本
④ListView1.ListItems(i).ListSubItems(j):取得指定第 i 行第 j+1 列的文本(类似于③)
⑤ListView1.SelectedItem.Index: 取得当前选中行的条目编号(从1开始计数)
⑥ListView1.SelectedItem.Key: 取得当前选中行的关键字(如果预先设置了的话)
⑦ListView1.SelectedItem.Text: 取得当前选中行第 1 列的文本,类似于②
⑧ListView1.SelectedItem.ListSubItems(j):取得当前选中行第 j+1 列的文本,类似于③
⑨ListView1.SelectedItem.SubItems(j):(同⑧)
删除某一行:
i = ListView1.SelectedItem.Index
ListView1.ListItems.Remove i
这样后面的行自然替补上去。
4 楼
guoyong_cy [专家分:3050] 发布于 2008-08-18 21:54:00
为了一个控件费这么多神,太累了!
5 楼
greatmenddc [专家分:0] 发布于 2008-08-19 09:32:00
十分感谢一江秋水的详尽解释,你说的一点不错,我刚学VB不到一个月.很多概念还没建立,遇到你这样的热心人真的很幸运,我会很快入门,总有一天会和你一样帮助更多的人学习VB.
6 楼
老大徒伤悲 [专家分:29120] 发布于 2008-08-19 14:49:00
greatmenddc,不错,greatmenddc,加油!
我来回复