搜索列表框中的字符串,DataSource属性集

时间:2012-07-11 18:07:29

标签: vb.net listbox datasource

我正在尝试将TextBox1设为搜索栏,以便在ListBox1中搜索特定字符串。

我希望它删除没有我搜索过的字符串的其他项目。该列表显示特定目录中的所有文件,因此,如果我搜索“icon _”,则显示名称中包含图标_ 的文件。这可能吗?

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

  

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

2 个答案:

答案 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,这可能是您想要玩的。

相关问题