2016-07-19 22 views
0

ich den folgenden Code renne in einem BackgroundWorker in der DoWork RoutineVB.Net prüfen Combobox.Text von Hintergrund Arbeiter

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 

SubjectName ist ein Textbox und AgencyReferrer ist ein Combobox.

Der Texbox Teil des Codes abgeschlossen ist ohne Probleme, aber die Combobox Teil sagen versagt:

Eine Ausnahme des Typs ‚System.InvalidOperationException‘ in System.Windows.Forms.dll aufgetreten war aber nicht im Benutzercode bearbeitet

Weitere Informationen: Kreuzfadenoperation nicht gültig: Steuerung 'AgencyReferrer' von einem anderen Thread als dem Thread zugegriffen wurde es war erstellt am.

Ich kann nicht verstehen, wie ein Texbox zu einem Combobox in Hinsicht anders behandelt wird nur überprüft, was der Text-Wert.

Irgendwelche Ideen?

+0

Sie können Argumente an die DoWork-Methode übergeben, die in diesem Fall der Text dieser Steuerelemente sein könnte. – Plutonix

+1

Ich sehe keinen Grund für diesen Code in einem BackgroundWorker zu sein. Wenn Sie einen BackgroundWorker verwenden, greifen Sie nicht auf die GUI-Steuerelemente zu - Sie erhalten inkonsistente Ergebnisse, die bei Ihnen auftreten. – LarsTech

Antwort

0

Sie können nicht auf Most Controller-Mitglieder über Thread Grenzen zugreifen oder aktualisieren. In einigen Fällen kann der Zugriff auf TextBox.Text fehlschlagen, in den meisten Fällen wird es funktionieren. Es funktioniert nicht garantiert.

Ohne zu viel Code zu ändern, können Sie die ComboBox mit Control.Invoke() arbeiten lassen. Obwohl die Text Text Eigenschaft funktioniert, sollten Sie diesen Aufruf auch aufrufen.

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 

diese Anrufe aufrufen kann mühsam sein, so sehen How to change textbox.text while in backgroundworker? über Möglichkeiten, die Invoke-If-Pflicht Muster zu automatisieren. Sie können ähnliche Schritte zum Abrufen von Eigenschaften ausführen.