回 帖 发 新 帖 刷新版面

主题:再问一江秋水

谢谢你此前给我的帮助,现在关于这段程序还有点不懂之处请教,我看不懂响应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个回复)

沙发

非也,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.时可以空值添加。 

板凳

如何返回选定值: 

  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 楼

如何获取多选的总行数?

  没有现成的属性,你只能遍历整个 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 楼

为了一个控件费这么多神,太累了!

5 楼


十分感谢一江秋水的详尽解释,你说的一点不错,我刚学VB不到一个月.很多概念还没建立,遇到你这样的热心人真的很幸运,我会很快入门,总有一天会和你一样帮助更多的人学习VB.

6 楼

greatmenddc,不错,greatmenddc,加油!

我来回复

您尚未登录,请登录后再回复。点此登录或注册