回 帖 发 新 帖 刷新版面

主题:求助!!急!关于text和checkbox

[email]null[/email]
[img]http://fm351.img.xiaonei.com/pic001/20080129/11/03/large_589c65.jpg[/img]   
这样的功能用什么控件实现?
我想用text,因为有滚动条.可是不知道怎样填加更多的checkbox(我需要用很多的checkbox),而且不知道怎样将text和checkbox组合到一起,我做的如下图:

[img]http://fm321.img.xiaonei.com/pic001/20080129/11/10/large_627e177.jpg[/img]

回复列表 (共6个回复)

沙发

可以试用ListView控件

板凳

[quote]可以试用ListView控件[/quote]
能否解释的更详细一点   我没用过ListView控件

3 楼

ListView控件的使用方法

   ListView控件可有4种不同的视图显示方法,跟“资源管理器”里的“查看”方式相似:(1)无图
标;(2)小图标;(3)列表;(4)报表式。 使用哪种视图,可由该控件的view属性设置控制。其
中“报表”视图用来显示记录数据很适合。 
    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

4 楼

如何发送消息来获得当前选择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选择
了一个条目,并选定的条目并不总是可以让用户看到。例如,如果你有很多条目
显示在控件中,你可以需要使用滚动条来显示在列表末尾的条目。幸运的是,L
istView控件使得编程滚动到选中的条目也变得容易。列表中的每个条目都有En
sureVisible方法。正如你所期望的,当你调用这个方法,它会强制控件显示该
条目于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个条目。 


如何获取多选的总行数?

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

5 楼

如何判断是否在空白处双击?

  你可以在双击事件中使用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.ListItems.count:条目总数
ListView1.SelectedItem.Index:当前选中的条目编号(行)
ListView1.ListItems(i).SubItems(j):当前选中条目 j 字段的文本,i=条目编号(行),j=字段编号(从1开始计数)
ListView1.ListItems(i).ListSubItems(j):当前选中字段的文本,i=条目编号,j=字段编号(j从1开始计数)
ListView1.ListItems(i).text:取得最前字段的文本(注:ListView1.ListItems(i).SubItems(1)效果相同)
ListView1.ListItems(i).Selected:一个条目是否反相显示
ListView1.LabelEdit = 1 '禁止修改最前字段的文本

  可以使用ListView1.SelectedItem.Index获得当前行。但没有办法获得当前列。


一江秋水的说明:以上都是在网上找到的,我没有整理

6 楼


谢谢!非常感谢!

我来回复

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