Перебирайте пустое текстовое поле, пока в текстовом поле не появятся данные - PullRequest
0 голосов
/ 06 ноября 2019

Я уверен, что есть простое решение, но оно ускользает от меня. У меня есть форма с тремя текстовыми полями на нем. Перед запуском основного кода я хочу убедиться, что в каждом текстовом поле есть данные. Я инициализировал hasData как переменную, которая будет определять, может ли код двигаться дальше или нет. Я оцениваю hasData в цикле Do While, но код обнаруживает наличие текстовых полей без данных и задаю для переменной hasData значение «False». Но затем я нахожусь в непрерывном цикле, окно сообщения никогда не исчезает, чтобы позволить вам вводить текст в пустые текстовые поля.

Спасибо за вашу помощь.

    Dim hasData As String

    hasData = "False"

    Do While hasData = "False"
        If txtTechManName.Text.Trim = "" Or txtDirectory.Text.Trim = "" Or txtBxUnique.Text.Trim = "" Then
            btnExecute.Enabled = False
            hasData = "False"
            MsgBox(" Please fill all text boxes on form ")
            ' this resulted in an endless loop of the msgBox. It didn't let me add text to the empty fields
        Else
            btnExecute.Enabled = True
            hasData = "True"
        End If
    Loop

    If (hasData = "True") Then
        searchDir = txtDirectory.Text
        Prefix = txtBxUnique.Text
        Dim manualName = txtTechManName.Text

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Видите ли вы, как вы должны были перечислить TextBoxes дважды? Список элементов управления одинаков в обоих случаях, так почему же двойная работа?

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

Если вы когда-нибудь хотели добавить TextBox в логику, то вам не забудьте обновить код вдва места. У вас может быть даже более двух мест ...

  1. Перечислять текстовые поля только один раз в какую-то коллекцию IEnumerable.
  2. Используйте LINQ, чтобы помочь вам с логикой.
  3. Используйте методы для инкапсуляции логики, чтобы ваш программный поток был более плавным и понятным.
' 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
0 голосов
/ 06 ноября 2019

Я переместил свое условие оценки в кнопки выполнения при событии щелчка. Там я запускаю оператор if, и когда hasData имеет значение true, запускаю функцию с остальным кодом.

    Private Sub btnExecute_Click(sender As Object, e As EventArgs) Handles btnExecute.Click
    Dim hasData As Boolean = False
    If txtTechManName.Text.Trim = "" Or txtDirectory.Text.Trim = "" Or txtBxUnique.Text.Trim = "" Then
        hasData = False
        MsgBox(" Please fill all text boxes on form ")

        If txtTechManName.Text.Trim = "" Then
            txtTechManName.Focus()
        ElseIf txtDirectory.Text.Trim = "" Then
            txtDirectory.Focus()
        ElseIf txtBxUnique.Text.Trim = "" Then
            txtBxUnique.Focus()
        End If
    Else
        hasData = True
        runProgram()
    End If
End Sub
...