0

我正在尝试制作TextBox1一个搜索栏,以在ListBox1.

我希望它删除没有我搜索的字符串的其他项目。该列表显示特定目录中的所有文件,因此如果我搜索“icon_”,它只会显示名称中带有icon_的文件。这可能吗?

我刚才问过这个问题,但我不能使用任何答案,因为列表框是由来自特定目录的文件名填充的,这给了我这个错误:

设置 DataSource 属性时无法修改项目集合。

4

2 回答 2

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 回答
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

事实上,另一个有趣的选项是您可以设置AutoCompleteSourceFileSystem,您可能想使用它。

于 2012-07-11T18:49:18.310 回答