FindItem 方法示例
本示例将 Biblio.mdb 数据库中 Publishers 表的内容植入 ListView 控件中。同时也将 FindItem 方法的三个选项植入 ComboBox 控件。一个 CommandButton 包含 FindItem 方法的代码;单击按钮后将提示输入欲搜索的字符串,然后使用 FindItem 方法在 ListView 控件中搜索此字符串。如找到字符串则使用 EnsureVisible 方法滚动控件以显示找到的 ListItem 对象。要试用此例,请将 ListView、ComboBox 及 CommandButton 控件放置在窗体上,并将代码粘贴到窗体的声明部分。运行示例并单击命令按钮。注意 必须使用“工具”菜单的“引用”命令添加 Microsoft DAO 3.0 对象库的引用,否则示例无法运行。Private Sub Form_Load()
   '为 ColumnHeader 对象创建对象变量。
   Dim clmX As ColumnHeader
   '添加 ColumnHeaders。列宽度等于控件宽度
   '除以 ColumnHeader 对象的数目。
   Set clmX = ListView1.ColumnHeaders. _
   Add(, , "Company", ListView1.Width / 3)
   Set clmX = ListView1.ColumnHeaders. _
   Add(, , "Address", ListView1.Width / 3)
   Set clmX = ListView1.ColumnHeaders. _
   Add(, , "Phone", ListView1.Width / 3)
   
   ListView1.BorderStyle = ccFixedSingle  '设置 BorderStyle 属性。
   ListView1.View = lvwReport  '设置 View 属性为报表型。
   Command1.Caption = "&FindItem"
   
   '用 FindItem 选项标注 OptionButton 控件。
      Option1(0).Caption = "Text"
      Option1(1).Caption = "SubItem"
      Option1(2).Caption = "Tag"
      ListView1.FindItem = 0 '设置 ListView 控件的 FindItem 属性为文本。
   End With
   
   '将数据库记录植入 ListView 控件。
   '为数据访问对象创建对象变量。
   Dim myDb As Database, myRs As Recordset
   '设置数据库为 BIBLIO.MDB 数据库。
   Set myDb = DBEngine.Workspaces(0).OpenDatabase("BIBLIO.MDB")
   '设置 recordset 为 Publishers 表。
   Set myRs = myDb.OpenRecordset("Publishers", dbOpenDynaset)
   
   '若当前记录不是最后一条记录,则添加 ListItem 对象。
   '使用新对象的引用设置属性。
   '设置 Text 属性为 Name 字段 (myRS!Name)。
   '设置 SubItem(1) 为 Address 字段 (myRS!Address)。
   '设置 SubItem(7) 为 Phone 字段 (myRS!Telephone)。   While Not myRs.EOF
      Dim itmX As ListItem   'ListItem 变量。
      Dim intCount As Integer   '计数器变量。
      '使用 Add 方法添加新的 ListItem 并为新引用设置对象。
      '使用引用设置
      '属性。
      Set itmX = ListView1.ListItems.Add(, , CStr(myRs!Name))
      intCount = intCount + 1 'Tag 属性计数器递增。
      itmX.Tag = "ListItem " & intCount  '用计数器值设置 Tag。      '若 Address 字段不为空,则设置 subitem 1 为此字段。
      If Not IsNull(myRs!Address) Then
         itmX.SubItems(1) = CStr(myRs!Address) 'Address 字段。
      End If
         
      '若 Phone 字段不为空,则设置 subitem 2 为此字段。
      If Not IsNull(myRs!Telephone) Then
         itmX.SubItems(2) = myRs!Telephone  'Phone 字段。
      End If
         
      myRs.MoveNext   '移动到下一条记录。
   Wend
End SubPrivate Sub Command1_Click()
   'FindItem 方法。
   '创建名为 intSelectedOption 的整数类型变量
   '来存储选定按钮的索引。
   '创建名为 strFindMe 的字符串变量。使用 InputBox
   '把查找的字符串存储在变量中。使用
   ' FindItem 方法查找字符串。使用 Option1 
   '切换决定在何处查找的 FindItem 参数。
   
   Dim intSelectedOption as Integer
   Dim strFindMe As String
   If Option1(0).Value = True then
      strFindMe = InputBox("Find in " & Option1(0).Caption)
      intSelectedOption = lvwText
   End If
   If Option1(1).Value = True then
      strFindMe = InputBox("Find in " & Option1(1).Caption)
      intSelectedOption = lvwSubItem
   End If
   If Option1(2).Value = True then
      strFindMe = InputBox("Find in " & Option1(2).Caption)
      intSelectedOption = lvwTag
   End If   'FindItem 方法返回找到的项目的引用,所以
   '必须创建对象变量并将
   '找到的项目设置给它。
   Dim itmFound As ListItem   'FoundItem 变量。
   
   Set itmFound = ListView1. _
   FindItem(strFindMe, intSelectedOption, , lvwPartial)
   
   '若未找到符合条件的 ListItem 则通知用户并退出。如果
   '找到 ListItem,则使用 EnsureVisible 方法滚动控件,
   '并选定 ListItem。
   If itmFound Is Nothing Then  '若没有匹配成功,则通知用户并退出。
      MsgBox "No match found" 
      Exit Sub
   Else
       itmFound.EnsureVisible '滚动 ListView 以显示找到的 ListItem。
       itmFound.Selected = True   '选定ListItem。
      '将焦点返回给控件以查看选择。
       ListView1.SetFocus
   End If
End SubPrivate Sub ListView1_LostFocus()
   '控件失去焦点后,重新将每个
   ' ListItem 的 Selected 属性设置为 False。
   Dim i As Integer
   For i = 1 to ListView1.ListItems.Count
      ListView1.ListItems.Item(i).Selected = False
   Next i
End Sub

解决方案 »

  1.   

    不成功 :(
    要查找的数据在SubItems(1)Dim li As ListItem
    Dim MID as String
    MID = "23"    Set li = Lv.FindItem(MID, 1, , lvwPartial)
        If li Is Nothing Then
            MsgBox "没找到.", 64, Me.Caption
        Else
            li.Selected = True
            li.EnsureVisible
        End If
    End If
      

  2.   

    控件的FindItem方法可以让你这么做。 
        这个方法包括4个参数: string、value、index、match。参数string包含你要搜索的字符串;而参数value(在智能提示中为'where')告诉VB在哪里搜索指定的字符串--在Text (lvwText)、subitems (lvwSubItem)或Tag (lvwTag)属性中。 参数index表示VB从哪个条目开始进行搜索,而参数match告诉VB是否搜索整个字符串(lvwWholeWord)或部分匹配(lvwPartial)。参数string是唯一必须的参数。而我的程序执行不成功,是否是我的Microsoft Windows Common Controls 6.0不是升级版本的缘故?如果那位能执行成功,请把控件的版本编号告诉我,谢谢
      

  3.   

    我这样想是减少数据库的访问量,如果命中很大的目标,会很慢的
    就算用TOP命令,可是还是不太好,客户只是想找找看,如果一找反而看不到别的数据如果FindItem 能成功,最好,如果不能,我会考虑各位所说的,谢谢