Progressbar funktioniert nicht

  • VB.NET

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Progressbar funktioniert nicht

    Hallo zusammen,

    Ich habe in Form1 eine Progressbar1 und einen Button1.

    Im ClickEvent von Button1 steht folgendes:

    VB.NET-Quellcode

    1. Form2.visible = true


    Im Form2 Load_Event steht seehr viel Datenbankverarbeitungscode, bis sich die Form2 öffnet vergehen einige sekunden.
    Jetzt möchte ich das die Progressbar1 auf Form1 den Fortschritt anzeigt bis sich die Form2 öffnet.
    Dafür habe ich im Form2 Load_Event Code nach jedem Datenbankzugriffscode geschrieben:

    VB.NET-Quellcode

    1. ...code
    2. Form1.Progressbar1.value = 10
    3. ...code
    4. Form1.Progressbar1.value = 20
    5. ...code
    6. Form1. Progressbar1.value = 30
    7. ...code
    8. usw.


    Leider aktualisiert sich die Progressbar1 auf Form1 nicht.

    Was mache ich falsch?

    vielen dank für die Hilfe im voraus!
    Weil der code im Hauptthread der Form2 ausgeführt wird und damit auch das Zeichnen der Form solange "hängt" bis der Code im Form_Load abgearbeitet ist.

    Lösung: Datenbankverarbeitungs Code in einen extra Thread/BackgroundWorker auslagern.
    Du greifst auf die falsche Instanz der Form1 zu.
    Schlechte Lösung:
    Übergib bei der Erstellung der Form2 mit New einen Form1-Parameter an die Form2, speichere diesen dann zwischen und nutze ihn zum Setzen der Progressbar.
    Gute Lösung:
    Gib der Form2 ein Event.
    Form1 mit Button und Progressbar, Form2 mit Button
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents MyForm2 As Form2
    3. Private Sub Progress(ByVal sender As System.Object, ByVal e As Form2.UpdateEventArgs) Handles MyForm2.updatePercent
    4. ProgressBar1.Value = e.Value
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. If MyForm2 Is Nothing OrElse MyForm2.IsDisposed Then
    8. MyForm2 = New Form2
    9. End If
    10. If Not MyForm2.Visible Then
    11. MyForm2.Show()
    12. End If
    13. End Sub
    14. End Class

    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Class UpdateEventArgs
    3. Inherits EventArgs
    4. Public Value As Integer
    5. Public Sub New(ByVal Val As Integer)
    6. Value = Val
    7. End Sub
    8. End Class
    9. Public Event updatePercent(ByVal sender As System.Object, ByVal e As UpdateEventArgs)
    10. Private _Value As Integer = 0
    11. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    12. _Value += 1
    13. RaiseEvent updatePercent(Me, New UpdateEventArgs(_Value))
    14. End Sub
    15. End Class



    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!
    Mach Dir ein separates Projekt, füge da meinen Code ein und studiere ihn.
    Button1 in Form1 ruft Form2 auf.
    Button1 in Form2 steuert die Progressbar an.
    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!
    @a.setzer: zum Thema Threads gibt es hier und im Netz genügend Informationen, ja selbst wenn ich deine Frage an mich bei Google eingebe bekomme ich als erste Google Ergebnisse sogar jede Menge

    bit.ly/KooFqj

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dodo“ ()

    @Dodo - ja danke, hatte den Backgroundworker bereits im Google erkundet... jedoch mit viel Text verbunden.
    Warum viel Text wenn im Endefekkt nur 2 zeilchen nötig sind :)

    Ich habs grad eilig - muss das Projekt schnell zu Ende bekommen, ansonsten bin ich auch ein Google Freund.

    @RodFrom Germany!
    Habe ich getan und demnach den Code in mein Projekt versucht einzubauen.

    Am Ende der Form1 habe ich eingefügt:

    VB.NET-Quellcode

    1. Private WithEvents Progressbar As C7Kameraprüfung
    2. Private Sub Progress(ByVal sender As System.Object, ByVal e As C7Kameraprüfung.UpdateEventArgs) Handles Progressbar.updatePercent
    3. ProgressBar1.Value = e.Value
    4. End Sub


    Am Ende der Form2 habe ich eingefügt:

    VB.NET-Quellcode

    1. Public Class UpdateEventArgs
    2. Inherits EventArgs
    3. Public Value As Integer
    4. Public Sub New(ByVal Val As Integer)
    5. Value = Val
    6. End Sub
    7. End Class
    8. Public Event updatePercent(ByVal sender As System.Object, ByVal e As UpdateEventArgs)
    9. Private _Value As Integer = 0


    Im Load Event der Form2 habe ich eingefügt:

    VB.NET-Quellcode

    1. _Value += 10
    2. RaiseEvent updatePercent(Me, New UpdateEventArgs(_Value))



    funktioniert nicht!!

    RodFromGermany schrieb:

    Mach Dir ein separates Projekt, füge da meinen Code ein und studiere ihn.

    a.setzer schrieb:

    funktioniert nicht!!
    Was funktioniert nicht?
    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!
    Die Progressbar verändert Ihren status nicht während das form2.load.event verarbeitet wird...

    Habe in der mitte des load_event_codes eingefügt:

    VB.NET-Quellcode

    1. _Value += 10
    2. RaiseEvent updatePercent(Me, New UpdateEventArgs(_Value))


    An diesem Punkt sollte die Progressbar doch dann wenigstens auf 10% springen
    und den restlichen code verarbeiten

    RodFromGermany schrieb:

    Mach Dir ein separates Projekt, füge da meinen Code ein und studiere ihn.

    Hast Du das getan?
    Bei mir funktioniert es.
    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!

    a.setzer schrieb:

    Private WithEvents Progressbar As C7Kameraprüfung

    Idt C7Kameraprüfung die Klasse, in der folgender Code steht:

    VB.NET-Quellcode

    1. _Value += 10
    2. RaiseEvent updatePercent(Me, New UpdateEventArgs(_Value))
    :?: :?: :?:
    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!
    Ja richtig, im LOAD event der Form "C7Kameraprüfung" steht zwischen dem laaaaangen Code

    VB.NET-Quellcode

    1. _Value += 10
    2. RaiseEvent updatePercent(Me, New UpdateEventArgs(_Value))


    Auf der Form "Form1" befindet sich die ProgressBar
    und der Code

    VB.NET-Quellcode

    1. Public Class UpdateEventArgs
    2. Inherits EventArgs
    3. Public Value As Integer
    4. Public Sub New(ByVal Val As Integer)
    5. Value = Val
    6. End Sub
    7. End Class
    8. Public Event updatePercent(ByVal sender As System.Object, ByVal e As UpdateEventArgs)
    9. Private _Value As Integer = 0

    a.setzer schrieb:

    Im Load Event der Form2 habe ich eingefügt:

    VB.NET-Quellcode

    1. _Value += 10
    2. RaiseEvent updatePercent(Me, New UpdateEventArgs(_Value))

    a.setzer schrieb:

    im LOAD event der Form "C7Kameraprüfung" steht
    Nun noch einmal:
    Form2 <=> Form "C7Kameraprüfung"

    RodFromGermany schrieb:

    Ist C7Kameraprüfung die Klasse, in der folgender Code steht:
    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!
    FORM "Form1"

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    3. Progressbar = New C7Kameraprüfung
    4. Progressbar.Show()
    5. 'Datumfeld 2 darf nicht kleiner sein als Datumfeld 1
    6. If DateTimePicker2.Value <= DateTimePicker1.Value Then
    7. MessageBox.Show("ungültiger Zeitraum!", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
    8. Exit Sub
    9. End If
    10. 'Auswertungsseite aufrufen!!!
    11. 'C7 Firewall
    12. If ComboBox2.Text = ("C7 Firewall") Then
    13. If Not ComboBox3.Text = ("-- keine Auswahl --") Then
    14. C7Firewall.Visible = True
    15. Else : MessageBox.Show("Es wurde kein C7 Blendentyp angewählt!", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
    16. End If
    17. 'C7 Kameraprüfung
    18. ElseIf ComboBox2.Text = ("C7 Kameraprüfung") Then
    19. If Not ComboBox3.Text = ("-- keine Auswahl --") Then
    20. C7Kameraprüfung.Visible = True
    21. Else : MessageBox.Show("Es wurde kein C7 Blendentyp angewählt!", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
    22. End If
    23. 'B8PA
    24. ElseIf ComboBox2.Text = ("B8PA") Then
    25. If Not ComboBox3.Text = ("-- keine Auswahl --") Then
    26. B8PALackpruefung.Visible = True
    27. Else : MessageBox.Show("Es wurde kein B8PA Typ angewählt!", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
    28. End If
    29. End If
    30. End Sub
    31. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    32. Me.Close()
    33. End Sub
    34. Private WithEvents Progressbar As C7Kameraprüfung
    35. Private Sub Progress(ByVal sender As System.Object, ByVal e As C7Kameraprüfung.UpdateEventArgs) Handles Progressbar.updatePercent
    36. ProgressBar1.Value = e.Value
    37. End Sub
    38. End Class



    FORM "C7Kameraprüfung"

    VB.NET-Quellcode

    1. Public Class C7Kameraprüfung
    2. Private Sub C7Kameraprüfung_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. 'GANZ VIEL CODE
    4. _Value += 10
    5. RaiseEvent updatePercent(Me, New UpdateEventArgs(_Value))
    6. 'GANZ VIEL CODE
    7. End Sub
    8. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    9. Me.Close()
    10. End Sub
    11. Public Class UpdateEventArgs
    12. Inherits EventArgs
    13. Public Value As Integer
    14. Public Sub New(ByVal Val As Integer)
    15. Value = Val
    16. End Sub
    17. End Class
    18. Public Event updatePercent(ByVal sender As System.Object, ByVal e As UpdateEventArgs)
    19. Private _Value As Integer = 0
    20. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.setzer“ ()

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Progressbar = New C7Kameraprüfung
    3. Progressbar.Show()
    4. End Sub
    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!