Hallo Leute,
ich versuche momentan einen Backgroundworker mit einer Progressbar zu realisieren. Mein Projekt sieht so aus, ich lade Daten aus einer SQL-Datenbank in ein DGV. Das DGV kann man über die rowfilter-Methode filtern. Zusätzlich wird bei jedem Datensatz geschaut, ob es in einem Verzeichnis Dateien zu diesem Datensatz gibt. Dadurch werden zwei Spalten(Verträge und Beschwerden) im DGV hinzugefügt in denen, dann jeweils "Ja" oder "Nein" für vorhandene Dateien steht.
Problem bei dieser Lösung ist es, dass beim Filtern der Datensätze zu langen Ladezeiten führt. Damit der Benutzer nun sieht, dass etwas passiert möchte ich eine Progressbar mit Backgroundworker realisieren.
Momentaner Stand:
MainKlasse
Klasse mit verschiedenen Funktionen
Soweit funktioniert das alles. Nun weiß ich aber nicht, wo und wie ich den ReportProgess von dem Backgroundworker hinschreiben soll. Woher weiß er mit wieviel Prozent er die Progessbar füllen muss?! Geht das ganze überhaupt so?! Fragen über Fragen...
Achja wenn ich das ganze jetzt Ausführe bringt er mir ein Fehler bei der Funktion "vertragsFeldENTHINZU()"
"Additional information: Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.."
Kann damit absolut nichts anfangen. Hoffe ihr könnt mich auf die richtige Spur bringen
Gruß
ich versuche momentan einen Backgroundworker mit einer Progressbar zu realisieren. Mein Projekt sieht so aus, ich lade Daten aus einer SQL-Datenbank in ein DGV. Das DGV kann man über die rowfilter-Methode filtern. Zusätzlich wird bei jedem Datensatz geschaut, ob es in einem Verzeichnis Dateien zu diesem Datensatz gibt. Dadurch werden zwei Spalten(Verträge und Beschwerden) im DGV hinzugefügt in denen, dann jeweils "Ja" oder "Nein" für vorhandene Dateien steht.
Problem bei dieser Lösung ist es, dass beim Filtern der Datensätze zu langen Ladezeiten führt. Damit der Benutzer nun sieht, dass etwas passiert möchte ich eine Progressbar mit Backgroundworker realisieren.
Momentaner Stand:
MainKlasse
VB.NET-Quellcode
- Private Sub aus_indi_SelectionChangeCommitted(sender As System.Object, e As System.EventArgs) Handles aus_indi.SelectionChangeCommitted, ausw_angebot.SelectionChangeCommitted,..........................
- BackgroundWorker1.RunWorkerAsync()
- End Sub
- Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
- Call vertragsFeldENTHINZU()
- dvauswertung.RowFilter = ""
- If ausw_land.SelectedIndex > 0 Or aus_indi.SelectedIndex > 0 Or ausw_angebot.SelectedIndex > 0 Or ausw_plz.SelectedIndex > 0 Or aus_preisniveau.SelectedIndex > 0 Or ...... Then
- dvauswertung.RowFilter = filterSQL() 'Wenn ein filter ausgewählt --> Funktion filterSQL aufrufen und filterstring zusammenbauen
- Else
- Call tabelleAuswertungFuellen() 'Kein Filter ausgewählt --> tabelle füllen ohne Filter
- End If
- If check_vertraege.Checked = True Then
- Call fileVorhandenpruefen()
- End If
- End Sub
- Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
- MessageBox.Show("Funktioniert")
- End Sub
- Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
- End Sub
Klasse mit verschiedenen Funktionen
VB.NET-Quellcode
- Public Function filterSQL() As String
- Dim bundesland As String = frm_basis.ausw_land.SelectedValue
- Dim indikation As String = frm_basis.aus_indi.SelectedValue
- Dim plz As String = frm_basis.ausw_plz.SelectedValue
- Dim filter As String = ""
- Dim preisniveau As String = frm_basis.aus_preisniveau.SelectedItem
- Dim klinikangebot As String = ""
- Dim preisKleiner As String = frm_basis.ausw_preiskleiner.Text
- Dim preisGroßer As String = frm_basis.ausw_preisgroßer.Text
- Dim ik_nummer As String = frm_basis.aus_ik_nummer.Text
- Dim landkreis As String = frm_basis.ausw_landkreis.SelectedValue
- Dim premium As String = frm_basis.ausw_premium.SelectedItem
- 'IndikationsString
- If frm_basis.aus_indi.SelectedIndex > 0 Then
- indikation = "IndiID = " & indikation & ""
- End If
- 'BundeslandString
- If frm_basis.ausw_land.SelectedIndex > 0 Then
- bundesland = " AND BundeslandID = " & bundesland & ""
- End If
- 'KrankenhausangebotString
- If frm_basis.ausw_angebot.SelectedIndex > 0 Then
- klinikangebot = angebot()
- End If
- 'Postleitzahl
- If frm_basis.ausw_plz.SelectedIndex > 0 Then
- plz = " AND Postleitzahl = " & plz & ""
- End If
- 'Preisniveau
- If frm_basis.aus_preisniveau.SelectedIndex > 0 Then
- preisniveau = " AND Preisniveau = '" & preisniveau & "'"
- End If
- filterParameterBEARB(bundesland, indikation, klinikangebot, plz, preisniveau)
- filter = indikation & bundesland & klinikangebot & plz & preisniveau
- filterSTRINGbearb(filter) 'Entfernt gegebenfalls am Anfang des FILTERStrings "AND"
- Return filter
- End Function
- Function fileVorhandenpruefen()
- ' Prüfen ob Vertragsfile vorhanden
- vertragsFeldENTHINZU()
- Dim VGVpfad As String = "######################"
- Dim ik_nummerDGV As String = ""
- Dim hilfsstring As String
- ' Überprüfen im Ordner VGV ob die Klinik ein Vertrag besitzt
- frm_basis.dgv_auswertung.Columns.Add("fileVGV", "Vergütungsverträge")
- Dim dirVGV As New DirectoryInfo(VGVpfad)
- For i As Integer = 0 To frm_basis.dgv_auswertung.RowCount - 2
- ik_nummerDGV = frm_basis.dgv_auswertung.Item(0, i).Value
- For Each file As FileInfo In dirVGV.GetFiles
- hilfsstring = file.Name.Substring(0, 9)
- If hilfsstring = ik_nummerDGV Then
- frm_basis.dgv_auswertung.Item(18, i).Value = "Ja"
- End If
- Next
- If frm_basis.dgv_auswertung.Item(18, i).Value = "" Then
- frm_basis.dgv_auswertung.Item(18, i).Value = "Nein"
- End If
- Next
- ' Überprüfen im Ordner Beschwerde ob die Klinik ein Vertrag besitzt
- frm_basis.dgv_auswertung.Columns.Add("fileBes", "Beschwerden")
- For i As Integer = 0 To frm_basis.dgv_auswertung.RowCount - 2
- ik_nummerDGV = frm_basis.dgv_auswertung.Item(0, i).Value
- Dim beschwerdePfad As String = "##########################"
- Dim dirBeschwerde As New DirectoryInfo(beschwerdePfad)
- If IO.Directory.Exists(beschwerdePfad) Then
- For Each file As FileInfo In dirBeschwerde.GetFiles
- hilfsstring = file.Name.Substring(0, 9)
- If hilfsstring = "" Then GoTo keineBeschwerde
- frm_basis.dgv_auswertung.Item(19, i).Value = "Ja"
- Next
- End If
- keineBeschwerde:
- If frm_basis.dgv_auswertung.Item(19, i).Value = "" Then
- frm_basis.dgv_auswertung.Item(19, i).Value = "Nein"
- End If
- Next
- End Function
- Function vertragsFeldENTHINZU()
- 'Falls Checkbox Filter Verträge false dann werden die Spalten entfernt
- If frm_basis.dgv_auswertung.Columns.Contains("fileVGV") = True Then
- frm_basis.dgv_auswertung.Columns.Remove("fileVGV")
- End If
- If frm_basis.dgv_auswertung.Columns.Contains("fileBes") = True Then
- frm_basis.dgv_auswertung.Columns.Remove("fileBes")
- End If
- End Function
Soweit funktioniert das alles. Nun weiß ich aber nicht, wo und wie ich den ReportProgess von dem Backgroundworker hinschreiben soll. Woher weiß er mit wieviel Prozent er die Progessbar füllen muss?! Geht das ganze überhaupt so?! Fragen über Fragen...
Achja wenn ich das ganze jetzt Ausführe bringt er mir ein Fehler bei der Funktion "vertragsFeldENTHINZU()"
"Additional information: Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.."
Kann damit absolut nichts anfangen. Hoffe ihr könnt mich auf die richtige Spur bringen
Gruß