Backgroundworker-Progressbar-DGV filtern

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Backgroundworker-Progressbar-DGV filtern

    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

    VB.NET-Quellcode

    1. Private Sub aus_indi_SelectionChangeCommitted(sender As System.Object, e As System.EventArgs) Handles aus_indi.SelectionChangeCommitted, ausw_angebot.SelectionChangeCommitted,..........................
    2. BackgroundWorker1.RunWorkerAsync()
    3. End Sub
    4. Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    5. Call vertragsFeldENTHINZU()
    6. dvauswertung.RowFilter = ""
    7. 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
    8. dvauswertung.RowFilter = filterSQL() 'Wenn ein filter ausgewählt --> Funktion filterSQL aufrufen und filterstring zusammenbauen
    9. Else
    10. Call tabelleAuswertungFuellen() 'Kein Filter ausgewählt --> tabelle füllen ohne Filter
    11. End If
    12. If check_vertraege.Checked = True Then
    13. Call fileVorhandenpruefen()
    14. End If
    15. End Sub
    16. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    17. MessageBox.Show("Funktioniert")
    18. End Sub
    19. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    20. End Sub​


    Klasse mit verschiedenen Funktionen

    VB.NET-Quellcode

    1. Public Function filterSQL() As String
    2. Dim bundesland As String = frm_basis.ausw_land.SelectedValue
    3. Dim indikation As String = frm_basis.aus_indi.SelectedValue
    4. Dim plz As String = frm_basis.ausw_plz.SelectedValue
    5. Dim filter As String = ""
    6. Dim preisniveau As String = frm_basis.aus_preisniveau.SelectedItem
    7. Dim klinikangebot As String = ""
    8. Dim preisKleiner As String = frm_basis.ausw_preiskleiner.Text
    9. Dim preisGroßer As String = frm_basis.ausw_preisgroßer.Text
    10. Dim ik_nummer As String = frm_basis.aus_ik_nummer.Text
    11. Dim landkreis As String = frm_basis.ausw_landkreis.SelectedValue
    12. Dim premium As String = frm_basis.ausw_premium.SelectedItem
    13. 'IndikationsString
    14. If frm_basis.aus_indi.SelectedIndex > 0 Then
    15. indikation = "IndiID = " & indikation & ""
    16. End If
    17. 'BundeslandString
    18. If frm_basis.ausw_land.SelectedIndex > 0 Then
    19. bundesland = " AND BundeslandID = " & bundesland & ""
    20. End If
    21. 'KrankenhausangebotString
    22. If frm_basis.ausw_angebot.SelectedIndex > 0 Then
    23. klinikangebot = angebot()
    24. End If
    25. 'Postleitzahl
    26. If frm_basis.ausw_plz.SelectedIndex > 0 Then
    27. plz = " AND Postleitzahl = " & plz & ""
    28. End If
    29. 'Preisniveau
    30. If frm_basis.aus_preisniveau.SelectedIndex > 0 Then
    31. preisniveau = " AND Preisniveau = '" & preisniveau & "'"
    32. End If
    33. filterParameterBEARB(bundesland, indikation, klinikangebot, plz, preisniveau)
    34. filter = indikation & bundesland & klinikangebot & plz & preisniveau
    35. filterSTRINGbearb(filter) 'Entfernt gegebenfalls am Anfang des FILTERStrings "AND"
    36. Return filter
    37. End Function
    38. Function fileVorhandenpruefen()
    39. ' Prüfen ob Vertragsfile vorhanden
    40. vertragsFeldENTHINZU()
    41. Dim VGVpfad As String = "######################"
    42. Dim ik_nummerDGV As String = ""
    43. Dim hilfsstring As String
    44. ' Überprüfen im Ordner VGV ob die Klinik ein Vertrag besitzt
    45. frm_basis.dgv_auswertung.Columns.Add("fileVGV", "Vergütungsverträge")
    46. Dim dirVGV As New DirectoryInfo(VGVpfad)
    47. For i As Integer = 0 To frm_basis.dgv_auswertung.RowCount - 2
    48. ik_nummerDGV = frm_basis.dgv_auswertung.Item(0, i).Value
    49. For Each file As FileInfo In dirVGV.GetFiles
    50. hilfsstring = file.Name.Substring(0, 9)
    51. If hilfsstring = ik_nummerDGV Then
    52. frm_basis.dgv_auswertung.Item(18, i).Value = "Ja"
    53. End If
    54. Next
    55. If frm_basis.dgv_auswertung.Item(18, i).Value = "" Then
    56. frm_basis.dgv_auswertung.Item(18, i).Value = "Nein"
    57. End If
    58. Next
    59. ' Überprüfen im Ordner Beschwerde ob die Klinik ein Vertrag besitzt
    60. frm_basis.dgv_auswertung.Columns.Add("fileBes", "Beschwerden")
    61. For i As Integer = 0 To frm_basis.dgv_auswertung.RowCount - 2
    62. ik_nummerDGV = frm_basis.dgv_auswertung.Item(0, i).Value
    63. Dim beschwerdePfad As String = "##########################"
    64. Dim dirBeschwerde As New DirectoryInfo(beschwerdePfad)
    65. If IO.Directory.Exists(beschwerdePfad) Then
    66. For Each file As FileInfo In dirBeschwerde.GetFiles
    67. hilfsstring = file.Name.Substring(0, 9)
    68. If hilfsstring = "" Then GoTo keineBeschwerde
    69. frm_basis.dgv_auswertung.Item(19, i).Value = "Ja"
    70. Next
    71. End If
    72. keineBeschwerde:
    73. If frm_basis.dgv_auswertung.Item(19, i).Value = "" Then
    74. frm_basis.dgv_auswertung.Item(19, i).Value = "Nein"
    75. End If
    76. Next
    77. End Function
    78. Function vertragsFeldENTHINZU()
    79. 'Falls Checkbox Filter Verträge false dann werden die Spalten entfernt
    80. If frm_basis.dgv_auswertung.Columns.Contains("fileVGV") = True Then
    81. frm_basis.dgv_auswertung.Columns.Remove("fileVGV")
    82. End If
    83. If frm_basis.dgv_auswertung.Columns.Contains("fileBes") = True Then
    84. frm_basis.dgv_auswertung.Columns.Remove("fileBes")
    85. End If
    86. 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?! :D 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ß
    @Kevin12345 Es gibt 2 Möglichkeiten:
    • Du schätzt ab, wieviel Prozent abgearbeitet sind, entweder grob und unpräzise (kein Aufwand) oder genau (hoher Aufwand)
      oder
    • Du meldest gar keinen Progress und schaltest die ProgressBar auf Style = Marquee, dann signalisiert sie einfach nur Beschäftigung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Kevin12345 schrieb:

    Backgroundworker
    Das ist ein Einzeiler. Probier aus, wie lange das dauert bei Deiner Anzahl von Dateien. Danach entscheide.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Kevin12345 schrieb:

    Backgroundworker
    Das ist ein Einzeiler.
    Ist es nicht.
    Backgroundworker ist ein Datentyp.
    Und mit einem Einzeiler kann man mit einem Backgroundworker auf keinen Fall irgendetwas erreichen.

    Im anderen Punkt stimme ich dir zu: Je mehr Dateien einzulesen sind, desto länger dauerts. Und das sollte er nachmessen, denn u.U. ist das kaum der Rede wert.

    Ich sagte übrigens "in ein Dictionary einlesen", von Array sagte ich nichts.
    Und ob man das beim Startup macht, oder wann anders, ist eine weitere Frage - je nachdem , wie oft sich das betreffnde Dateisystem ändert.

    Jdfs. auf keinen Fall für jede zu untersuchende Datei eine eigene Datei-Suche abfahren - das sagte ich.