【问题标题】:Loop through empty textbox until the textbox has data循环遍历空文本框,直到文本框有数据
【发布时间】:2019-11-07 00:36:27
【问题描述】:

我确信对此有一个简单的解决方案,但它让我无法理解。我有一个表格,上面有三个文本框。在运行主代码之前,我想确保每个文本框都有数据。我已经将“hasData”初始化为决定代码是否可以继续运行的变量。我在 Do While 循环中评估 hasData,但代码发现存在没有数据的文本框并将 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

【问题讨论】:

  • 首先,当hasData 用于表示布尔值时,为什么要将其声明为String 类型?
  • 你在做什么来触发表单验证?
  • 是的,我希望 hasData 为布尔值,但一直出错。
  • 当然不是。这才是重点。这是不应该的。如果您继续执行代码,那么用户将无法修复没有数据的事实。您需要停止执行代码,以便用户可以输入数据,然后需要以某种方式再次启动验证,方法是单击 Button 或其他方式。如果你不这样做,那么你期待魔法来解决它。您需要了解 GUI 的工作原理。
  • 查看Control.Validating 事件。主要兴趣点是ErrorProvider 类。

标签: vb.net textbox


【解决方案1】:

你知道你必须两次列出文本框吗?两种情况下的控件列表都是一样的,那为什么要加倍呢?

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

如果您想在逻辑中添加一个 TextBox,那么您必须记住在两个地方更新代码。你甚至可能有两个以上的地方......

  1. 仅在某种 IEnumerable 集合中列出一次 TextBox。
  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

【讨论】:

  • 这很好,但我不完全理解这些功能。你能写出它们在代码中的含义吗?
【解决方案2】:

我将评估条件移至点击事件的执行按钮。在那里我运行一个 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

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多