如何在列表框中的某些文本后检查字符?

时间:2016-11-01 21:49:23

标签: vb.net search listbox

如何检查列表框中其他文本后的字符?

e.g 列表框内容:

Key1: V

Key2: F

Key3: S

Key4: H

如何找到Key1-4之后的内容:?

Key1-4将始终相同,但之后的内容将由用户定义。

我想出了如何保存复选框,因为只有2个值可供选择,尽管用户定义的文本框是我所挣扎的。 (我已经搜索了解决方案,但似乎没有一个对我有用)

用法:

    Form1_Load
    If ListBox1.Items.Contains("Key1: " & UsersKey) Then
            TextBox1.Text = UsersKey
        End If

其中textbox1.text将包含V /用户定义的任何内容。

我确实尝试了一些有用的东西:

    Form1_Load
    Dim UsersKey as string = "V"
    If ListBox1.Items.Contains("Key1: " & UsersKey) Then
            TextBox1.Text = UsersKey
        End If

但我不确定如何向"V"添加其他字母/数字,然后将该特定数字/字母输出到文本框。 (我阻止了特殊字符)

推理我需要这个是因为我已经创建了一个自定义保存设置,可以保存退出并使用form1加载,因为内置保存设置没有太多自定义。 例如,无法选择保存路径,当更改文件名时,会生成新的user.config以及丢失的旧设置。

3 个答案:

答案 0 :(得分:2)

查看正则表达式。

使用样本中的密钥:

Dim keys As String = "VFSH"
Dim exp As New RegEx("Key[1-4]: ([" & keys& "])")
For Each item As String in ListBox1.Items
    Dim result = exp.Match(item)
    If result.Success Then
        TextBox1.Text = result.Groups(1).Value
    End If
Next 

我不清楚你的ListBoxes是如何工作的。例如,如果您在ListBox1中找到需要忽略的“Key 2:”,则需要将表达式的[1-4]部分更改为更具体。

此外,如果你只是想排除unicode或标点符号,你也可以使用范围:

Dim keys As String = "A-Za-z0-9"

如果您支持更广泛的字符集,则必须注意以下几点:]\^-都可以具有特殊性正则表达式字符类中的含义。

答案 1 :(得分:1)

你有多个键,我假设你有多个文本框来显示结果?

然后这样的事情会起作用。循环通过键盘的总数,在你通过字母表循环的内部。找到匹配项后,输出到正确的文本框:

    Dim UsersKey As String
    For i As Integer = 1 To 4
        For Each c In "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()
            UsersKey = c
            If ListBox1.Items.Contains("Key" & i & ": " & UsersKey) Then
                Select Case i
                    Case 1
                        TextBox1.Text = UsersKey
                    Case 2
                        TextBox2.Text = UsersKey
                    Case 3
                        TextBox3.Text = UsersKey
                    Case 4
                        TextBox4.Text = UsersKey
                End Select
                Exit For 'match found so exit inner loop
            End If
        Next
    Next

另外,您说在更改文件名时您的设置会丢失。我假设版本发生变化? “设置”具有从先前版本读取的升级方法。如果添加UpgradeSettings布尔选项并将其设置为True,然后在应用开始时执行此操作,则会加载以前版本的设置:

    If My.Settings.UpgradeSettings = True Then
        My.Settings.Upgrade()
        My.Settings.Reload()
        My.Settings.UpgradeSettings = False
        My.Settings.Save()
    End If

更新的答案:

不是使用列表框,而是逐行读取设置文件,并根据键将结果输出到正确的文本框中......如下所示:

        Dim settingsFile As String = "C:\settings.txt"
        If IO.File.Exists(settingsFile) Then
            For Each line As String In IO.File.ReadLines(settingsFile)
                Dim params() As String = Split(line, ":")
                If params.Length = 2 Then
                    params(0) = params(0).Trim
                    params(1) = params(1).Trim
                    Select Case params(0)
                        Case "Key1"
                            Textbox1.Text = params(1)
                        Case "Key2"
                            Textbox2.Text = params(1)
                    End Select
                End If
            Next line
        End If

答案 2 :(得分:0)

您可以通过其NameTag属性将文本框与键相关联。让我们说你使用Name。在这种情况下,TextBox2key2相关联。 TextBox[N] <-> Key[N]

使用这个原则,代码看起来像这样[考虑到你的列表项是字符串]

Sub Test()

    If ListBox1.SelectedIndex = -1 Then Return

    Dim data[] As String = DirectCast(ListBox1.SelectedItem, string).Split(new char(){":"})

    Dim key As String = data(0).Substring(3) 
    Dim val As String = data(1).Trim() 

    ' you can use one of the known techniques to get control on which your texbox sits. 
    ' I omit this step and assume "Surface1" being a control on which your text boxes sit

     DirectCast(
         (From ctrl In Surface1.Controls 
         Where ctrl.Name = "TextBox" & key
         Select ctrl).First()), TextBox).Text = val

End Sub

正如你所看到的,使用我刚刚解释的原则,你几乎没有解析,重要的是,如果你得到20个文本框,就没有增长Select case。您可以根据需要添加任意数量的文本框和相应的列表项,但代码无需更改。