Vb.net如何将搜索级别设置为用户输入字符串

时间:2016-03-18 06:37:26

标签: vb.net

简介... 我的项目中有一个计数器可以计算指定路径中的文件。现在所有这些都取决于用户输入,因为相关的将进入设置并设置应搜索的扩展名(tbExt1.text)以及路径(tbpath.text)。路径列在lbchannel1列表框中。现在这对我的问题来说不会太重要,但我填写了它,所以下面的例子更容易理解。

以下是问题:如果要计算TopLevelOnly(FileIO.SearchOption.SearchTopLevelOnly)或TopAndSub(FileIO.SearchOption.SearchAllSubDirectories),用户应该能够解决。

所以我制作了一个组合框,他们可以从这两个选项中选择一个。当他们选择其中一个时, FileIO.SearchOption.SearchTopLevelOnly FileIO.SearchOption.SearchAllSubDirectories 将成为文本框中的文本tbTopOrSub1.text

这让我想到了下一部分。我在计数器中没有例如 FileIO.SearchOption.SearchAllSubDirectories ,而是添加tbTopOrSub1.text,因为我希望这会以相同的方式工作,但现在是用户依赖选项。看看:

   Dim TopOrSub1 As String 
   TopOrSub1 = tbTopOrSub1.Text     

   Dim fileTotal As Integer
   For Each item As String In lbChannel1.Items
       fileTotal += My.Computer.FileSystem.GetFiles(item.ToString, TopOrSub1, (tbExt1.Text)).Count
   Next

我认为这会像魅力一样,但它似乎不起作用。我收到此错误The converting from string FileIO.SearchOption.SearchTopLev to type Integer is not valid(可能是错误的翻译,因为错误是挪威语),我注意到它是如何使用TopLev。我想它太长了?我无法弄清楚如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

首先为您的VB项目添加Option Strict On。这有助于避免运行时错误。

因为您尝试将字符串转换为枚举(=整数)而发生错误。

组合框的好处在于它们具有DataSource属性,可以容纳任何类型的对象集合。此外,他们还有以下属性:

  1. DisplayMember:对象集的(公共)属性的名称 在DataSource。它的值将在UI中显示为"友好"文本。
  2. ValueMemberDataSource中设置的对象的属性名称。此值不会显示在UI中,但您可以在代码中访问它。
  3. 请参阅下面的例子,了解如何使用所有这些:

    保存显示文本(名称)和文件搜索选项值的对象:

     Class FileSearchOption
            Public Property Name As String
            Public Property Value As FileIO.SearchOption
     End Class
    

    填充您的组合框并设置其DataSource, DisplayMember and ValueMember

     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim searchOptions As New List(Of FileSearchOption)
            searchOptions.Add(New FileSearchOption() With {.Name = "TopLevelOnly", .Value = FileIO.SearchOption.SearchTopLevelOnly})
            searchOptions.Add(New FileSearchOption() With {.Name = "TopAndSub", .Value = FileIO.SearchOption.SearchAllSubDirectories})
    
            ComboBox1.DataSource = searchOptions
            ComboBox1.DisplayMember = "Name"
            ComboBox1.ValueMember = "Value"
       End Sub
    

    当用户选择了搜索选项时处理操作。请注意,有必要对SelectedValue进行DirectCast,因为它是Object类型。

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        Dim fileTotal As Integer
        For Each item As String In {"G:\"}
            fileTotal += My.Computer.FileSystem.GetFiles(item.ToString, DirectCast(ComboBox1.SelectedValue, FileIO.SearchOption), (tbExt1.Text)).Count
        Next
    End Sub