Logikproblem bei CheckBox

  • VB.NET
  • .NET 4.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Logikproblem bei CheckBox

    Hallo allerseits,
    auf einem Panel werden per Code einige Checkboxen hinzugefügt. Die erste Checkbox reagiert unabhängig auf Checked True/False
    Die restlichen schalten sich im Handler auf False. Nur die aktuell geklickte ändert Checked.
    Ich habe bereits Tests mit dem Auskommentierten Text gemacht und wenn das Häkchen gesetzt wurde, steht Checked auch auf True.

    Warum muss ich nun Checked auf True setzen, obwohl Checked durch den Klick schon den Wert True besitzt, damit das Häkchen auch gesetzt wird?

    Im Spoiler ist der komplette Code vom Handler und es geht um die Zeilen 12 & 13
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub chbKlasse_CheckedChanged(sender As Object, e As EventArgs)
    2. If DontChangeWithoutClick = True Then Exit Sub
    3. DontChangeWithoutClick = True
    4. Dim is_Clicked As CheckBox = CType(sender, CheckBox)
    5. If is_Clicked.Name = "Neutral" Then GoTo weiter
    6. For Each chbox As CheckBox In panKlassen.Controls
    7. If Not chbox.Name = "Neutral" Then
    8. If chbox.Name = is_Clicked.Name Then
    9. 'Me.Text = chbox.Checked.ToString
    10. 'DontChangeWithoutClick = False
    11. 'Exit Sub
    12. If chbox.Checked = True Then
    13. chbox.Checked = True
    14. Else
    15. chbox.Checked = False
    16. End If
    17. Else
    18. chbox.Checked = False
    19. End If
    20. End If
    21. Next
    22. weiter:
    23. DontChangeWithoutClick = False
    24. End Sub


    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    Wat... GoTo? Wa... Aber... Wieso...Da ist doch ein If... Ich schiebe es mal auf die Uhrzeit.
    Leg dich schlafen, und schau dir deinen Code morgen wieder an.

    Ansonsten... Ich habe ein paar Tests gemacht, und nach wie vor keine Ahnung, was du erreichen willst, oder was genau dein Problem ist... Geht es darum, alle anderen Chekboxen zu deaktivieren, sodass nur eine aktiv ist? Wenn ja, dann schau dir doch mal RadioButtons an. Von denen kann, innerhalb desselben Containers, immer nur einer aktiv sein. Ohne eine Zeile Code zu schreiben.
    SIMDoku (Simple Dokumentenverwaltung)
    Mein Lernprojekt um die verschiedensten Facetten der .NET Entwicklung zu erkunden.
    GitHub

    VB Paradise Dark Theme
    Inoffizieller VB-Paradise Discord.
    @Steppenpferd Wenn es noch nicht funktioniert, beschreib mal, was da passieren soll.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @EaranMaleasi GoTo Bed war gut, auch wenn der Schlaf nicht so gut war^^ Der RadioButton kommt allerdings nicht in Frage, da immer maximal 2 Optionen wählbar sind (Erste Box unabhängig klickbar).
    @RodFromGermany Funktioniert ja alles, die Frage ist aber warum nur so...

    Hier nochmal der Auskommentierte Code zum besseren nachvollziehen. Am besten mal ohne If abfrage (Zeile 12) Kompilieren um die Fragestellung besser zu verstehen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub chbKlasse_CheckedChanged(sender As Object, e As EventArgs)
    2. If DontChangeWithoutClick = True Then Exit Sub 'Endlosschleife verhindern
    3. DontChangeWithoutClick = True
    4. Dim is_Clicked As CheckBox = CType(sender, CheckBox) 'Geklickte CheckBox ermitteln
    5. If Not is_Clicked.Name = "Neutral" Then 'Erste Checkbox ist unabhänging der anderen klickbar
    6. For Each chbox As CheckBox In panKlassen.Controls 'Alle CheckBoxen im Panel durchlaufen
    7. If Not chbox.Name = "Neutral" Then 'Erste CheckBox ignorieren (da sie auch auf dem Panel ist, aber halt unabhängig von klicks der anderen)
    8. If chbox.Name = is_Clicked.Name Then 'Bei geklickter CheckBox auch wirklich das Häkchen setzen
    9. 'Me.Text = chbox.Checked.ToString
    10. 'DontChangeWithoutClick = False
    11. 'Exit Sub
    12. If chbox.Checked = True Then 'Lässt man diese Abfrage weg, tut sich nix beim klicken ab CheckBox Nr.2 (wiederholter klicks auf gleiche Box kann ja auch mal sein)
    13. chbox.Checked = True ' ?!? Warum muss man True setzen wenns bereits True ist, damit das Häkchen auch gesetzt wird ?!?
    14. Else
    15. chbox.Checked = False
    16. End If
    17. Else 'Restliche Häkchen entfernen
    18. chbox.Checked = False
    19. End If
    20. End If
    21. Next
    22. End If
    23. DontChangeWithoutClick = False
    24. End Sub


    Edit: Zum Form ein Panel mit Name panKlassen hinzufügen. Dann noch das Form_Load damit alles läuft
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub FormSuchen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim Check_Max_Size As Integer = 0
    3. Dim newFont As New Font("Lucida Console", 9)
    4. For i As Integer = 0 To 9
    5. Dim chb As New CheckBox
    6. If i=0 Then
    7. chb.Name ="Neutral"
    8. Else
    9. chb.Name ="iWas" & i.ToString()
    10. End If
    11. chb.AutoSize = True
    12. chb.Font = newFont
    13. chb.Text = chb.Name
    14. If chb.Size.Width > Check_Max_Size Then Check_Max_Size = chb.Size.Width
    15. chb.Location = New Point(5, (20 * i) + 24)
    16. chb.ForeColor = Color.AliceBlue
    17. chb.Visible = True
    18. panKlassen.Controls.Add(chb)
    19. AddHandler chb.CheckedChanged, AddressOf chbKlasse_CheckedChanged
    20. If i = 9 Then panKlassen.ClientSize = New Size(Check_Max_Size + 10, chb.Top + chb.Height + 3)
    21. Next
    22. End Sub

    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Steppenpferd“ ()

    Was RfG wahrscheinlich meinte: Kannst Du mal bitte ohne Code versuchen zu beschreiben, was Du vorhast? Oder besser: Mach ein Beispiel von dem, was dargestellt werden soll bzw. was Du versuchst, überhaupt aus der Realität in Programmcode zu gießen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Steppenpferd schrieb:

    Warum muss man True setzen wenns bereits True ist, damit das Häkchen auch gesetzt wird ?!?
    Ist das nicht wiedersinnig? Der Hacken ist doch bei True gesetzt! Bei dir wirklich nicht? (gibt's doch nicht!)

    VB.NET-Quellcode

    1. Private Sub chbox_CheckedChanged(sender As Object, e As EventArgs) Handles chbox.CheckedChanged
    2. If chbox.Checked = True Then 'Lässt man diese Abfrage weg, tut sich nix beim klicken ab ComboBox Nr.2 (wiederholter klicks auf gleiche Box kann ja auch mal sein)
    3. chbox.Checked = True ' ?!? Warum muss man True setzen wenns bereits True ist, damit das Häkchen auch gesetzt wird ?!?
    4. Debug.Print("Checked")
    5. Else
    6. chbox.Checked = False
    7. Debug.Print("Unchecked")
    8. End If
    9. End Sub
    Leute Sorry aber vergesst das Thema am besten.
    Hab grade Zeilen Auskommentiert und direkt wieder ne Virenmeldung bekommen.
    Zeilen wieder rein genommen, Virus weg Prog läuft.

    Wie es aussieht muss ich das ganze System mal wieder neu aufsetzen, hat iwie alles keinen Sinn mehr...

    Edit: Ist echt ein Witz, jetzt läuft sogar die Ursprüngliche Version ohne Fehler und ohne Virenmeldung.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub chbKlasse_CheckedChanged(sender As Object, e As EventArgs)
    2. If DontChangeWithoutClick = True Then Exit Sub
    3. DontChangeWithoutClick = True
    4. Dim is_Clicked As CheckBox = CType(sender, Checkbox)
    5. If Not is_Clicked.Name = "Neutral" Then
    6. For Each chbox As CheckBox In panKlassen.Controls
    7. If Not chbox.Name = "Neutral" And Not chbox.Name = is_Clicked.Name Then chbox.Checked = False
    8. Next
    9. End If
    10. DontChangeWithoutClick = False
    11. End Sub
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)

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

    Kontakt mit Kaspersky Support

    Hab grade mit dem Kaspersky Support gesprochen.
    Mir wurde ein Programm zur vollständigen Entfernung und ein Setup für die Aktuelle Version 2019 zugeschickt, weil ich sicherstellen wollte das es nicht an Kaspersky liegt, bevor ich das System für nix neu aufsetze.
    Mir wurde auch Empfohlen dem Support das Programm zuzuschicken, damit die tatsächliche Programmzeile ermittelt werden kann, die den Alarm auslöst.
    Bei dem Deckplaner sehe darin kein Problem, da der eh Kostenlos sein wird.
    Aber wie sieht es bei Programmen aus bei denen dies nicht der Fall ist?
    Würdet Ihr Programme an den Support senden, mit denen Ihr eventuell größeres vor habt?
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    Auf Firmenseite gibts es immer irgendwo irgendjemanden, der in der Lage ist dem Firmenweiten AV zu sagen, dass die Datei durch darf.
    Was Normalverbraucher angeht, würde ich einfach dazu raten deren AV wegzuwerfen, und einfach den Windows Defender einzusetzen, mit dem es Microsoft inzwischen richtig ernst meint.
    Und zwar Cross-Plattform-Ernst. Keine Werbung, Sauber ins System integriert (auf Windows), und so gut wie die anderen was die Trefferquoten angeht. Und Achja, Kostenlos.
    SIMDoku (Simple Dokumentenverwaltung)
    Mein Lernprojekt um die verschiedensten Facetten der .NET Entwicklung zu erkunden.
    GitHub

    VB Paradise Dark Theme
    Inoffizieller VB-Paradise Discord.