我正在尝试制作TextBox1
一个搜索栏,以在ListBox1
.
我希望它删除没有我搜索的字符串的其他项目。该列表显示特定目录中的所有文件,因此如果我搜索“icon_”,它只会显示名称中带有icon_的文件。这可能吗?
我刚才问过这个问题,但我不能使用任何答案,因为列表框是由来自特定目录的文件名填充的,这给了我这个错误:
设置 DataSource 属性时无法修改项目集合。
我正在尝试制作TextBox1
一个搜索栏,以在ListBox1
.
我希望它删除没有我搜索的字符串的其他项目。该列表显示特定目录中的所有文件,因此如果我搜索“icon_”,它只会显示名称中带有icon_的文件。这可能吗?
我刚才问过这个问题,但我不能使用任何答案,因为列表框是由来自特定目录的文件名填充的,这给了我这个错误:
设置 DataSource 属性时无法修改项目集合。
有很多不同的方法可以做到这一点。
此方法将您的文件列表放入 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
设置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
事实上,另一个有趣的选项是您可以设置AutoCompleteSource
为FileSystem
,您可能想使用它。