首页 > 解决方案 > Backgroundworker 给出多个错误信息

问题描述

我有一个包含三个文本框的表单。在我的BackgroundWorker1_DoWork处理程序中,我测试是否TextBox有空并启动MessageBox要求用户填写所有TextBoxes。这是在一个Try/Catch块中完成的。我的问题是两个方面。如果TextBox未填写 es,则用户在引发异常时获得第一个MessageBox,然后是另一个……所以这将是用户获得的第二个。在我的处理程序中,我测试是否抛出了一个。它从不承认错误并立即执行块,这将是用户收到的第三个消息框,说“处理完成”。不应显示“流程完成”。MessageBoxCatchMessageBoxBackGroundWorker1_RunWorkCompletedExceptionElse

如何测试是否有TextBox未填写的 es 以及是否没有 throw 1MessageBox告诉用户填写所有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

标签: vb.netbackgroundworker

解决方案


我建议您一次检查一个文本框,如果它为空,则显示该消息:

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

否则,运行工人。

祝你好运。


推荐阅读