Loop through empty textbox until the textbox has data

后端 未结 2 2019
南旧
南旧 2021-01-29 15:14

I\'m sure there\'s a simple solution on this, but it escapes me. I have a form with three text boxes on it. Before the main code is run I want to make sure each text box has dat

2条回答
  •  时光取名叫无心
    2021-01-29 15:37

    Do you see how you had to list the TextBoxes twice? The list of controls is the same in both cases, so why do double work?

    If txtTechManName.Text.Trim = "" Or txtDirectory.Text.Trim = "" Or txtBxUnique.Text.Trim = "" Then
        ' ...
        If txtTechManName.Text.Trim = "" Then
            txtTechManName.Focus()
        ' ...
    

    If you ever wanted to add a TextBox to the logic, then you'd have to remember to update the code in two places. You may even have more than two places...

    1. Only list the TextBoxes once in some kind of IEnumerable collection.
    2. Use LINQ to help you with some of the logic.
    3. Use methods to encapsulate the logic, so your program flow is smoother and easier to understand.
    ' store the TextBoxes in a collection
    Private ReadOnly textBoxes As New List(Of TextBox)()
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' add the TextBoxes which should be filled to the collection
        textBoxes.AddRange({txtTechManName, txtDirectory, txtBxUnique})
    End Sub
    
    Private Function hasData() As Boolean
        ' ![any TextBox is invalid] == all TextBoxes are valid
        Return Not textBoxes.Any(AddressOf textBoxIsInvalid)
    End Function
    
    Private Function lastInvalidTextBox() As TextBox
        ' last TextBox with invalid entry, or default (null)
        Return textBoxes.LastOrDefault(AddressOf textBoxIsInvalid)
    End Function
    
    ' returns true when passed TextBox is invalid
    Private Function textBoxIsInvalid(tb As TextBox) As Boolean
        ' define invalid here, in once place only
        Return String.IsNullOrWhiteSpace(tb.Text)
    End Function
    
    Private Sub btnExecute_Click(sender As Object, e As EventArgs) Handles btnExecute.Click
        ' simply checks the hasData function which hides the logic
        If hasData() Then
            runProgram()
        Else
            MessageBox.Show("Please fill all text boxes on form")
            ' focus the last invalid TextBox, effectively the same as your original logic
            ' if it is null (no invalid TextBox, see lastInvalidTextBox()), isn't called
            lastInvalidTextBox()?.Focus()
        End If
    End Sub
    

自定义标题
段落格式
字体
字号
代码语言
提交回复
热议问题