リストボックス内のすべての項目を完全一致・前方一致検索 (4個) (SNo.105) | |
使用コントロール | ListBox1 Button1 〜 Button4 |
その他条件 | WindowsXP(Vista) Visual Basic 2005(VB2008) |
リストボックス内のすべての項目を完全一致・前方一致検索
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個だけとかの色々のパターンで試して見て下さい。 検索開始行と該当データが同じ行だと見つけないようです、従って見つかった次の行から再度、検索すると、該当データが続いたような場合、検索洩れが発生したり、それを回避しょうとすると、無限ループに入ったりと結構面倒でした。 |