Backgroundworker 给出多条错误信息

Backgroundworker gives multiple error messages

我有一个包含三个文本框的表单。在我的 BackgroundWorker1_DoWork 处理程序中,我测试是否有任何 TextBox 为空并启动 MessageBox 要求用户填写所有 TextBoxes。这是在 Try/Catch 块中完成的。我的问题有两个。如果 TextBoxes 未填写,用户将获得第一个 MessageBox,然后在抛出 Catch 异常时获得另一个 MessageBox...所以这将是第二个MessageBox 用户得到。在我的 BackGroundWorker1_RunWorkCompleted 处理程序中,我测试是否抛出了 Exception。它从不确认错误并立即执行 Else 块,这将是用户收到的第三个消息框,上面写着 "Process complete." 不应显示流程完成。

我如何测试是否有任何 TextBoxes 未填写,如果它们没有抛出 1 MessageBox 告诉用户填写所有 TextBoxes?并让我的 RunWorkerComplete 处理程序确认 ElseIf e.Error IsNot Nothing.

感谢您的帮助。

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    BackgroundWorker1.WorkerReportsProgress = True
    Try

        For Each cntrl As Control In Me.Controls()
            If TypeOf cntrl Is TextBox Then
                If CType(cntrl, TextBox).Text.Equals(String.Empty) Or (CType(cntrl, TextBox).Text = "") Then
                    cntrl.BackColor = Color.Yellow
                    MessageBox.Show("Please enter value in all fields on form" & cntrl.Name.ToString())
                    cntrl.Focus()
                End If
            End If
        Next

        runProgram()
    Catch ex As Exception
        MessageBox.Show("An error occured while trying to load this application. Please contact Maxine Hammett for assistance " &
        vbNewLine & "" & vbNewLine & String.Format("Error: {0}", ex.Message))
    End Try
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If e.Cancelled = True Then
        MsgBox(" Operation Cancelled ")
        ProgressBar1.Value = 0
    ElseIf e.Error IsNot Nothing Then
        MsgBox("Error in RunWorkerComplete" & e.Error.Message)
    Else
        MsgBox(" Process Complete ")
        Close()
    End If
End Sub

将控件检查移至执行按钮。但是现在我收到有关文本框没有路径的错误(其中一个文本框是文件夹的路径)。

Private Sub btnExecute_Click(sender As Object, e As EventArgs) Handles btnExecute.Click
    Dim launchProgram As Boolean = False

    While launchProgram = False
        For Each cntrl As Control In Me.Controls()
            If TypeOf cntrl Is TextBox Then
                If CType(cntrl, TextBox).Text.Equals(String.Empty) Or (CType(cntrl, TextBox).Text = "") Then
                    cntrl.BackColor = Color.Yellow
                    MessageBox.Show("Please enter value in all fields on form" & cntrl.Name.ToString())
                    cntrl.Focus()
                    launchProgram = False
                Else
                    launchProgram = True
                End If
            End If
        Next
    End While

    If launchProgram = True Then
        BackgroundWorker1.RunWorkerAsync()
    End If
End Sub

我建议您一次选中一个文本框,如果为空则显示消息:

Private Sub btnExecute_Click(sender As Object, e As EventArgs) Handles btnExecute.Click
    For Each cntrl As TextBox In Controls.OfType(Of TextBox)
        If String.IsNullOrEmpty(cntrl.Text) Then
            cntrl.BackColor = Color.Yellow
            MessageBox.Show("Please enter value in all fields on form" & cntrl.Name.ToString())
            cntrl.Focus()
            Return
        Else
            cntrl.BackColor = SystemColors.Window
        End If
    Next

    BackgroundWorker1.RunWorkerAsync()
End Sub

或者,如果您确实需要以这种方式提示用户,则可以连接 For..Each 块中的空文本框的名称:

Private Sub btnExecute_Click(sender As Object, e As EventArgs) Handles btnExecute.Click
    Dim sb As New StringBuilder

    For Each cntrl As TextBox In Controls.OfType(Of TextBox)
        If String.IsNullOrEmpty(cntrl.Text) Then
            If sb.Length > 0 Then sb.Append(", ")
            sb.Append(cntrl.Name)
            cntrl.BackColor = Color.Yellow
        Else
            cntrl.BackColor = SystemColors.Window
        End If
    Next

    If sb.Length > 0 Then
        MessageBox.Show("Please enter value in all fields on form" & sb.ToString())
        Controls.OfType(Of TextBox).Where(Function(a) String.IsNullOrEmpty(a.Text)).FirstOrDefault?.Focus()
        Return
    End If

    BackgroundWorker1.RunWorkerAsync()
End Sub

否则,运行 工人。

祝你好运。