VB.Net检查来自后台工作者的Combobox.Text

时间:2016-07-19 21:03:08

标签: vb.net winforms combobox backgroundworker

我在BackgroundWorker例程的DoWork中运行以下代码

 Dim P As String
        Dim B As Integer

        P = "Verifying User Inputs"
        B = B + 1

        If SubjectName.Text = "" Then
            P = "No Subject Name Entered"
            InputValidate.ReportProgress(B, P)
            Threading.Thread.Sleep(250)
        Else
            B = B + 1
        End If

        If AgencyReferrer.Text = "" Or AgencyReferrer.Text = "Configure In Settings" Then
            P = "No Agency Of Referrer Selected"
            InputValidate.ReportProgress(B, P)
            Threading.Thread.Sleep(250)
        Else
            B = B + 1
        End If

SubjectNameTextboxAgencyReferrerCombobox

代码的Texbox部分完成没有任何问题,但Combobox部分无法说:

  

类型' System.InvalidOperationException'的例外情况发生在   System.Windows.Forms.dll但未在用户代码中处理

     

附加信息:跨线程操作无效:控制   ' AgencyReferrer'从线程以外的线程访问   创建于。

我无法理解TexboxCombobox的区别对待方式只是检查文本值是什么。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您无法访问或更新大多数控件'跨越线程边界的成员。在某些情况下,访问TextBox.Text可能会失败,在大多数情况下它会起作用。它不能保证有效。

无需更改太多代码,您可以使用Control.Invoke()使ComboBox正常工作。即使TextBox Text属性有效,您也应该调用该调用。

Dim P As String
Dim B As Integer

Dim agencyReferrerText = AgencyReferrer.Invoke(New Func(Of String)(Function() AgencyReferrer.Text))

P = "Verifying User Inputs"
B = B + 1

If SubjectName.Text = "" Then
    P = "No Subject Name Entered"
    InputValidate.ReportProgress(B, P)
    Threading.Thread.Sleep(250)
Else
    B = B + 1
End If

If agencyReferrerText = "" Or agencyReferrerText = "Configure In Settings" Then
    P = "No Agency Of Referrer Selected"
    InputValidate.ReportProgress(B, P)
    Threading.Thread.Sleep(250)
Else
    B = B + 1
End If

调用这些调用可能很麻烦,因此请参阅How to change textbox.text while in backgroundworker?有关自动调用Invoke-If-Required模式的方法。您可以执行类似的检索属性。