玄関へお回り下さい。 
リストボックス内のすべての項目を完全一致・前方一致検索 (4個)          (SNo.105)
使用コントロール ListBox1 Button1 〜 Button4
その他条件 WindowsXP(Vista) Visual Basic 2005(VB2008)
  
リストボックス内のすべての項目を完全一致・前方一致検索

Private Sub Form1_Load(ByVal sender As System.Object, _
                       
ByVal e As System.EventArgs) Handles MyBase.Load
'テスト用データを表示(たちつてとの部分を色々コメントにしてテストして下さい)
   
With ListBox1
        .Items.Add("たちつてと")
        .Items.Add("たちつてと")
        .Items.Add("あいうえお")
        .Items.Add("かきくけこ")
        .Items.Add("さしすせそ")
        .Items.Add("たちつてと")
        .Items.Add("たちつ")
        .Items.Add("なにぬねの")
        .Items.Add("はひふへほ")
        .Items.Add("まみむめも")
        .Items.Add("たちつ")
       .Items.Add("たちつてと")
       .Items.Add("たちつてと")
   
End With
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
                         
ByVal e As System.EventArgs) Handles Button1.Click
'"たちつ"を前方一致検索(最初に見つかった分だけ)
    'すべての選択状態を解除する
    ListBox1.ClearSelected()
   
Dim x As Integer = -1
    x = ListBox1.FindString("たちつ", x)
   
If x <> -1 Then
        ListBox1.SetSelected(x, 
True)
        MessageBox.Show(x + 1 & " 番目に見つかりました。")
   
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
                         
ByVal e As System.EventArgs) Handles Button2.Click
'"たちつ"を完全一致検索(最初に見つかった分だけ)
    'すべての選択状態を解除する
    ListBox1.ClearSelected()
   
Dim x As Integer = -1
    x = ListBox1.FindStringExact("たちつ", x)
   
If x <> -1 Then
        ListBox1.SetSelected(x, 
True)
        MessageBox.Show(x + 1 & " 番目に見つかりました。")
   
End If
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, _
                         
ByVal e As System.EventArgs) Handles Button3.Click
'"たちつ"を前方一致検索(すべての項目を検索)
    'すべての選択状態を解除する
    ListBox1.ClearSelected()
   
Call sLBSearch(ListBox1, "たちつ")
    MessageBox.Show(ListBox1.SelectedIndices.Count & " 個見つかりました")
End Sub

Private Sub Button4_Click(ByVal sender As System.Object, _
                         
ByVal e As System.EventArgs) Handles Button4.Click
'"たちつ"を完全一致検索(すべての項目を検索)
    'すべての選択状態を解除する
    ListBox1.ClearSelected()
   
Call sLBSearch(ListBox1, "たちつ", 1)
    MessageBox.Show(ListBox1.SelectedIndices.Count & " 個見つかりました")
End Sub

'=================================================================
' LBox    :検索するリストボックス名
' SearchStr :検索する文字列
' Exact   :検索方法 1<>前方一致検索 1=完全一致検索(省略すれば前方一致検索)
' sPos    :検索開始位置
-1 = 最初から(省略化)
'==================================================================
Private Sub sLBSearch(ByVal LBox As ListBox, ByVal SearchStr As String, _
       
Optional ByVal Exact As Integer = 0, Optional ByVal sPos As Integer = -1)
'ListBox 内を完全一致・前方一致検索を再帰的に行うプロシージャ
   
Dim ret As Integer = -1
   
If Exact = 1 Then   '完全一致検索
        ret = ListBox1.FindStringExact(SearchStr, sPos)
   
Else                '前方一致検索
        ret = ListBox1.FindString(SearchStr, sPos)
   
End If
   
If ret <= sPos Or ret = -1 Then  '見つから無かった場合
         
Return
   
Else                '見つかった場合
       
With LBox
            .SelectionMode = SelectionMode.MultiExtended
            .SetSelected(ret, 
True)         '見つかった行を選択状態に
           
If ret < .Items.Count - 1 Then  '次の検索
                sLBSearch(LBox, SearchStr, Exact, ret)
           
Else
               
Return
           
End If
       
End With
   
End If
End Sub

     上記、検索の結果
     

検索のサンプルは、MSDNにもありますが、データの取得状況により無限ループに入りエラーが発生しますのでご注意下さい。

最初の1個だけとか最初の2個だけとか最後の1個だけとかの色々のパターンで試して見て下さい。

検索開始行と該当データが同じ行だと見つけないようです、従って見つかった次の行から再度、検索すると、該当データが続いたような場合、検索洩れが発生したり、それを回避しょうとすると、無限ループに入ったりと結構面倒でした。





2004/08/22
2005/10/18


VBレスキュー(花ちゃん)
VB.NET2003  VB2005