0

TextBox1で特定の文字列を検索するために、検索バーを作成しようとしていますListBox1

検索した文字列を持たない他のアイテムを削除したい。リストには特定のディレクトリ内のすべてのファイルが表示されるため、「icon_」を検索すると、名前にicon_が含まれるファイルのみが表示されます。これは可能ですか?

少し前にこの質問をしましたが、リストボックスに特定のディレクトリのファイル名が入力されているため、次のエラーが表示されるため、回答を使用できません。

DataSource プロパティが設定されている場合、Items コレクションは変更できません。

4

2 に答える 2

0

プロパティが設定されている場合DataSource、リストを変更することはできません。ListBoxプロパティを使用してコントロールに入力すると便利DataSourceですが、必須ではありません。Items.Add代わりに、そのメソッドを使用して項目をコントロールに追加できます。たとえば、前の質問に対する私の回答から借ります。

Public Class FileSearchTool
    Public Sub New(ByVal listBox As ListBox, ByVal textBox As TextBox)
        _listBox = listBox
        _textBox = textBox
    End Sub

    Private _listBox As ListBox
    Private WithEvents _textBox As TextBox
    Private _fileNames As New List(Of String)()
    Private _folderPath As String

    Public Property FolderPath() As String
        Get
            Return _folderPath
        End Get
        Set(ByVal value As String)
            _folderPath = value
            loadFilePaths()
        End Set
    End Property

    Private Sub loadFilePaths()
        _fileNames = New List(Of String)(Directory.GetFiles(_folderPath))
        refreshList()
    End Sub

    Private Sub _textBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles _textBox.TextChanged
        refreshList()
    End Sub

    Private Sub refreshList()
        _listBox.SuspendLayout()
        _listBox.Items.Clear()
        For Each item As String In _fileNames
            If item.StartsWith(_textBox.Text, StringComparison.CurrentCultureIgnoreCase) Then
                _listBox.Items.Add(item)
            End If
        Next
        _listBox.ResumeLayout()
    End Sub
End Class

次に、任意の形式で次のように使用できます。

Public Class Form1
    Private _tool As FileSearchTool
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        _tool = New FileSearchTool(ListBox1, TextBox1)
        _tool.FolderPath = "C:\"
    End Sub
End Class

ただし、その時点で、FileSearch ユーザー コントロールを作成して、さらにカプセル化することもできます。

または、前の質問への回答で述べたように、オートコンプリート ボックスだけが必要な場合は、リスト ボックスをまったく使用せずにテキスト ボックスを使用できます。

Dim source As New AutoCompleteStringCollection()
source.AddRange(Directory.GetFiles("C:\"))
TextBox1.AutoCompleteCustomSource = source
TextBox1.AutoCompleteMode = AutoCompleteMode.Suggest
TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource

実際、もう 1 つの興味深いオプションは、 に設定できるAutoCompleteSourceことFileSystemです。

于 2012-07-11T18:49:18.310 に答える
0

これを行うには、さまざまな方法があります。

このメソッドは、ファイルのリストを DataTable に配置し、BindingSource を使用して、その Filter プロパティを使用してリストをフィルター処理できます。

以下は、ListBox と TextBox を含むフォームです。

Public Class Form1
  Dim bs As New BindingSource

  Public Sub New()
    InitializeComponent()
  End Sub

  Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    MyBase.OnLoad(e)

    Dim testPath As String = "c:\MyPath"
    Dim dt As New DataTable
    dt.Columns.Add("File", GetType(String))

    For Each f As String In Directory.GetFiles(testPath)
      Dim row As DataRow = dt.NewRow
      row("File") = Path.GetFileName(f)
      dt.Rows.Add(row)
    Next
    bs.DataSource = dt

    ListBox1.DisplayMember = "File"
    ListBox1.ValueMember = "File"
    ListBox1.DataSource = bs
  End Sub

  Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
    bs.Filter = String.Format("File LIKE '*{0}*'", TextBox1.Text)
  End Sub

End Class
于 2012-07-11T18:47:33.677 に答える