Joey
Joey

Reputation: 33

How can i check for a character after certain text within a listbox?

How can i check for a character after other text within a listbox?

e.g Listbox contents:

Key1: V

Key2: F

Key3: S

Key4: H

How do I find what comes after Key1-4:?

Key1-4 will always be the same however what comes after that will be user defined.

I figured out how to save checkboxes as theres only 2 values to choose from, although user defined textboxes is what im struggling with. (I have searched for solutions but none seemed to work for me)

Usage:

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

Which textbox1.text would then contain V / whatever the user defined.

I did try something that kind of worked:

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

but i'm not sure how to add additional letters / numbers to "V", then output that specific number/letter to the textbox. (I have special characters blocked)

Reasoning I need this is because I have created a custom save settings which saves on exit and loads with form1 as the built in save settings doesn't have much customization. e.g Can't choose save path, when filename is changed a new user.config is generated along with old settings lost.

Upvotes: 1

Views: 333

Answers (3)

T.S.
T.S.

Reputation: 19340

You can associate text box with a key via its Name or Tag property. Lets say you use Name. In this case TextBox2 is associated with key2. TextBox[N] <-> Key[N]

Using this principle the code will look like this [considering that your list item is string]

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

As you can see, using principle I just explained, you have little parsing and what is important, there is no growing Select case if, lets say, you get 20 text boxes. You can add as many text boxes and as many corresponding list items as you wish, the code need not change.

Upvotes: 0

Chase Rocker
Chase Rocker

Reputation: 1908

You have multiple keys, I assume you have multiple textboxes to display the results?

Then something like this would work. Loop thru the total number of keys, inside that you loop thru the alphabet. When you find a match, output to the correct textbox:

    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

Also, you say your settings are lost when the filename is changed. I assume when the version changes? The Settings has an upgrade method to read from a previous version. If you add an UpgradeSettings boolean option and set it to True and then do this at the start of your app, it will load the settings from a previous version:

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

Updated Answer:

Instead of using a listtbox, read the settings file line by line and output the results to the correct textbox based on the key...something like this:

        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

Upvotes: 1

Joel Coehoorn
Joel Coehoorn

Reputation: 415765

Look at regular expressions for this.

Using the keys from your sample:

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 

It's not clear to me how your ListBoxes work. If you might find, for example, "Key 2:" inside ListBox1 that you need to ignore, you will want to change the [1-4] part of the expression to be more specific.

Additionally, if you're just trying to exclude unicode or punctuation, you could also go with ranges:

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

If you are supporting a broader set of characters, there are some you must be careful with: ], \, ^, and - can all have special meanings inside of a regular expression character class.

Upvotes: 2

Related Questions