Checkbox > Progressbar

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von TVX.

    Checkbox > Progressbar

    Guten Tag,

    habe 24 Checkboxen einzeln gemacht, jede liest beim Load den Checkstatus in einer eigenen Datei aus :wacko:
    Habe im ersten Tag eine Progressbar, diese soll das Maximum 24 haben und jede Checkbox soll einen Wert von 1 in die Bar füllen.
    Bin recht neu in VB und habe es bis jetzt mit paar Forumposts und learning by doing hinbekommen.
    Nun ja, ich überlege, wie ich es machen soll, denn der Status des Bar soll beim Laden ausgelesen werden, aber gleichzeitig auch mit Ankreuzen der Checkboxen aktuell mitlaufen.
    Wenn ich jeden Check zusätzlich in einem Dokument mit +1 oder -1 speichere und es von der Progessbar beim Laden auslesen lasse, ist es ja nicht "live".


    Hier mal der sehr umständliche Code bisher.


    VB.NET-Quellcode

    1. Dim A1 As String = My.Computer.FileSystem.ReadAllText("D:/xxx/xxx/xxx/xxx.ini")
    2. If A1 > 0 Then
    3. Auswahl1.Checked = True
    4. My.Computer.FileSystem.ReadAllText("D:/xxx/xxx/xxx/xxx.ini")
    5. Else
    6. Auswahl1.Checked = False
    7. End If

    Bei Load 24 mal :evil: (Sehr umständlich, möchte da aber nichts mehr neu machen.



    Unten beim Checkbox Klick (Auch 24 mal :D)

    VB.NET-Quellcode

    1. Private Sub Auswahl1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Auswahl1.CheckedChanged
    2. System.IO.File.WriteAllText("D:/xxx/xxx/xxx/xxx.ini", If(Auswahl1.Checked, "1", "0"))
    3. End Sub

    Wie mache ich es nun mit der Live Progressbar, die bei jedem Häkchen +1 dazurechnet oder wenn sie nicht angekreuzt ist 0 und wenn sie abgehakt wird -1 und das sie dennoch bei jedem Programm Load geladen wird und dennoch aktuell ist ?


    LG

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

    Das ist schon mit viel weniger Code umsetzber, so könnte man es beispielsweise machen, zwar nicht so schön, funktioniert aber.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ini As String = "app.chkChecked"
    3. Private ChkBox() As CheckBox
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. ChkBox = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11, CheckBox12, _
    6. CheckBox13, CheckBox14, CheckBox15, CheckBox16, CheckBox17, CheckBox18, CheckBox19, CheckBox20, CheckBox21, CheckBox22, CheckBox23, CheckBox24}
    7. If IO.File.Exists(ini) Then
    8. Dim s() As String = IO.File.ReadAllLines(ini)
    9. For i = 0 To ChkBox.Length - 1
    10. If s(i) = "1" Then
    11. ChkBox(i).Checked = True
    12. End If
    13. Next
    14. End If
    15. End Sub
    16. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    17. Dim s(ChkBox.Length - 1) As String
    18. For i = 0 To ChkBox.Length - 1
    19. s(i) = If(ChkBox(i).Checked, "1", "0")
    20. Next
    21. IO.File.WriteAllLines(ini, s)
    22. End Sub
    23. End Class


    Und mach unbedingt Option Strict On!!!
    Ich verstehe an der Stelle den Sinn einer ProgressBar nicht. Der Code ist so schnell durchgelaufen, das du garnicht mitbekommst wie sie sich füllt. Aber gut. Stell das Maximum der ProgressBar auf die Anzahl der CheckBoxen, nach jeden geladenen File, erhöhst du die Value um 1.

    VB.NET-Quellcode

    1. ProgressBar1.Increment(1)

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ProgressBar1.Minimum = 0
    5. ProgressBar1.Maximum = 3
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. Dim zähler As Integer = 0
    9. For Each chk In Me.Controls.OfType(Of CheckBox)()
    10. If chk.Checked Then zähler += 1
    11. Next
    12. ProgressBar1.Value = zähler
    13. End Sub
    14. End Class


    PS hatte nur 3 zum testen eingestellt :
    ProgressBar1.Maximum = 24
    Ich möchte das jeder Haken in der Checkbox die Progressbar einen Wert von +1 gibt und jeder nicht angekreuzte einen von 0 (aber nicht bei mehrmals ankreuzen der Wert steigt.
    Beim Laden und klicken soll der Fortschritt angezeigt und aktualisiert werden.
    Hier ein Beispiel wie es automatisch immer korrekt angezeigt wird (Vorausgesetzt du verwendest keine Container wie Panels usw.)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. ProgressBar1.Maximum = 10
    4. ' Allen Checkboxen des Event zuweisen
    5. Me.Controls.OfType(Of CheckBox).ToList.ForEach(Sub(item) AddHandler item.CheckedChanged, AddressOf CB_CheckedChanged)
    6. End Sub
    7. Private Sub CB_CheckedChanged(sender As Object, e As EventArgs)
    8. ' Alle gecheckten Checkboxen summieren und des Wert an die PB übergeben
    9. ProgressBar1.Value = Me.Controls.OfType(Of CheckBox).ToList.FindAll(Function(item) item.Checked).Count
    10. End Sub
    11. End Class


    Ist vielleicht als Anfänger ein bisschen viel, aber kurz erklärt was der Code macht:
    - Progressbar Maximum sollte klar sein
    Me.Controls.OfType(Of CheckBox).ToList.ForEach(Sub(item) AddHandler item.CheckedChanged, AddressOf CB_CheckedChanged)
    - Es wird allen Checkboxen das selbe Event zugeteilt, da ja auch bei jedem Ändern der Checkbox der Wert der PB verändert werden soll
    ProgressBar1.Value = Me.Controls.OfType(Of CheckBox).ToList.FindAll(Function(item) item.Checked).Count

    Hier werden alle Checkboxen durchlaufen und welche die Checked = True haben werden summiert. Die Summe (.Count) wird dann an die Value-Proertiy der Progressbar übergeben.


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Habe den Private Sub erstellt und das

    VB.NET-Quellcode

    1. Me.Controls.OfType(Of CheckBox).ToList.ForEach(Sub(item) AddHandler item.CheckedChanged, AddressOf CB_CheckedChanged)
    unter load gesteckt.
    Es tut sich nichts

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

    Erstelle testweise ein neues Projekt und füge den untenstehenden Code (dieser ist die mehrzeilige Variante) 1:1 ein.
    Ich hatte testweise mal 10 Checkboxen draufgeklatscht + 1 Progressbar (Progressbar1).

    VB.NET-Quellcode

    1. ' Load
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. ProgressBar1.Maximum = 10
    4. For each item in Me.Controls.OfType(Of CheckBox)
    5. AddHandler item.CheckedChanged, AddressOf CB_CheckedChanged
    6. Next
    7. End Sub
    8. ' CB_CheckChanged
    9. Private Sub CB_CheckedChanged(sender As Object, e As EventArgs)
    10. Dim Count as integer
    11. For each item in Me.Controls.OfType(Of CheckBox)
    12. if item.Checked Then
    13. Count +=1
    14. End if
    15. Next
    16. Progressbar1.Value = Count
    17. End Sub


    Hier siehst du vielleicht besser was genau passiert.
    Kannst ja Haltepunkte setzen und durchsteppen.

    Es tut sich übrigens auch erst dann etwas, wenn eine der Checkboxen geklickst wird.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hier wäre es am einfachsten wenn du die eine eigene Methode erstellst und diese dann von 2 Punkten aus aufrufst.

    VB.NET-Quellcode

    1. Private Sub SetProgressbarValue()
    2. Dim Count as integer
    3. For each item in Me.Controls.OfType(Of CheckBox)
    4. if item.Checked Then
    5. Count +=1
    6. End if
    7. Next
    8. Progressbar1.Value = Count
    9. End Sub


    Diese Methode rufst du dann einmal auf nachdem du alle Checkboxen befüllt hast und bei der CB_CheckedChanged-Methode

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. ProgressBar1.Maximum = 10
    3. For each item in Me.Controls.OfType(Of CheckBox)
    4. AddHandler item.CheckedChanged, AddressOf CB_CheckedChanged
    5. Next
    6. ' Hier deine Logik zum Befüllen der Checkboxen
    7. SetProgressbarValue()
    8. End Sub
    9. Private Sub CB_CheckedChanged(sender As Object, e As EventArgs)
    10. SetProgressbarValue()
    11. End Sub


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Der (( fichz )) hatte dir da doch schon was gutes geposten !

    Einfach die eine Zeile noch nach oben kopieren fertig ,
    und dann läds beim Start und beim klick...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. CheckBox1.Checked = True
    4. ProgressBar1.Maximum = 10
    5. ' Allen Checkboxen des Event zuweisen
    6. Me.Controls.OfType(Of CheckBox).ToList.ForEach(Sub(item) AddHandler item.CheckedChanged, AddressOf CB_CheckedChanged)
    7. ProgressBar1.Value = Me.Controls.OfType(Of CheckBox).ToList.FindAll(Function(item) item.Checked).Count
    8. End Sub
    9. Private Sub CB_CheckedChanged(sender As Object, e As EventArgs)
    10. ' Alle gecheckten Checkboxen summieren und des Wert an die PB übergeben
    11. ProgressBar1.Value = Me.Controls.OfType(Of CheckBox).ToList.FindAll(Function(item) item.Checked).Count
    12. End Sub
    13. End Class
    Bei mir tut sich nichts.

    Hier bis zum Load.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Google_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Google.Click
    3. Process.Start("http://www.google.de/")
    4. End Sub
    5. Private Sub SetProgressbarValue()
    6. Dim Count As Integer
    7. For Each item In Me.Controls.OfType(Of CheckBox)()
    8. If item.Checked Then
    9. Count += 1
    10. End If
    11. Next
    12. Progressbar1.Value = Count
    13. End Sub
    14. Private Sub CB_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    15. SetProgressbarValue()
    16. End Sub
    17. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    18. Progressbar1.Maximum = 24
    19. For Each item In Me.Controls.OfType(Of CheckBox)()
    20. AddHandler item.CheckedChanged, AddressOf CB_CheckedChanged
    21. Next
    22. ' Hier deine Logik zum Befüllen der Checkboxen
    23. SetProgressbarValue()
    24. Notiz1.ReadOnly = True
    25. Notiz2.ReadOnly = True
    26. ............


    So lädt er beim Load ob die Boxen angeklickt sind: (Das alles 24 mal untereinander)

    VB.NET-Quellcode

    1. Dim AW5 As String = My.Computer.FileSystem.ReadAllText("D:/Programm/Speicherdateien/Fortschritt/Auswahl5.ini")
    2. If AW5 > 0 Then
    3. Auswahl5.Checked = True
    4. Else
    5. Auswahl5.Checked = False
    6. End If


    So werden die Klicks gespeichert

    VB.NET-Quellcode

    1. Private Sub Auswahl1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Auswahl1.CheckedChanged
    2. System.IO.File.WriteAllText("D:/Programm/Speicherdateien/Fortschritt/Auswahl1.ini", If(Auswahl1.Checked, "1", "0"))
    3. End Sub


    Was ist falsch oder fehlt dort ?