我正在尝试将TextBox1
设为搜索栏,以便在ListBox1
中搜索特定字符串。
我希望它删除没有我搜索过的字符串的其他项目。该列表显示特定目录中的所有文件,因此,如果我搜索“icon _”,则仅显示名称中包含图标_ 的文件。这可能吗?
我刚才问过这个问题,但我不能使用任何答案,因为列表框是由特定目录中的文件名填充的,这给了我这个错误:
设置DataSource属性时无法修改项集合。
答案 0 :(得分: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
答案 1 :(得分: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
事实上,另一个有趣的选择是,您可以将AutoCompleteSource
设置为FileSystem
,这可能是您想要玩的。