none
Visual Studio 2008 C# Checkbox soll abgehakt sein wenn alles ausgefüllt ist RRS feed

  • Frage

  • Hey, habe ein Problem und hoffe dass mir jemand weiterhelfen kann.

    Ich habe eine Seite mit Visual Studio 2008 programmiert mit mehreren GroupBoxen in denen jeweils 3 Radiobuttons vorhanden sind. Ganz unten auf der Seite habe ich eine CheckBox.
    Nun will ich dass die Checkbox "checked" ist wenn ich jeweils einen Radiobutton einer Groupbox ausgewählt habe (also aus jeder Groupbox einen).

    Wäre super wenn mir jemand weiterhelfen kann. Danke schon mal im Voraus  :)

    Freitag, 23. August 2013 06:46

Antworten

  • Hallo,'
    mit was arbeitest du denn genau? WinForms/WPF/...? Die nachfolgenden Codes funktionieren in Windows Forms, in WPF müsste man es leicht anpassen.
    Du könntest nun entweder alles manuell abfragen, was dann so aussehen könnte:

    if((gb1_rb1.Checked || gb1_rb2.Checked || gb1_rb3.Checked)
    && (gb2_rb1.Checked || gb2_rb2.Checked || gb2_rb3.Checked)
    && (gb3_rb1.Checked || gb3_rb2.Checked || gb3_rb3.Checked))
    {//...

    Was natürlich nicht unbedingt schön oder dynamisch ist.

    Nun könntest du aber auch alle GroupBox'en durchgehen und die RadioButtons abfragen ob min. einer gecheckt ist. Das könnte man so machen:

                foreach(Control c in this.Controls)//Alle Controls durchgehen
                {
                    if(c is GroupBox)//Nur GroupBoxen auswählen, ggf. noch die Namen abprüfen
                    {
                        bool b = false;//Auf true setzen, sobald gecheckter RB gefunden wurde
                        foreach(Control rb in c.Controls)//Alle Controls in den GroupBoxen durchgehen
                        {
                            if(rb is RadioButton)//Nur RadioButtons)
                            {
                                if((rb as RadioButton ).Checked)
                                {
                                    b = true;//Gecheckten gefunden
                                    break;//Schleife unterbrechen
                                }
                            }
                        }
                        if(!b)//Ein GroupBox ohne gechekctem RB gefunden
                        {
                            checkBox1.Checked = false;
                            return;//Damit =true anweisung zum schluss nicht mehr ausgeführt werden kann
                        }
                    }
                }
                checkBox1.Checked = true;//Überall einen gecheckten RB gefunden

    Der Code mag zwar länger sein, aber die GUI ist deutlich einfacher zu erweitern. Wie immer habe ich den Code weitestgehend kommentiert.

    Um den Code jedesmal aufzurufen, wenn ein RadioButton sich ändert, musst du das CheckedChanged-Event abfangen und dann den Code aufrufen.

    Nun könntest du aber auch noch Felder/Eigenschaften erstellen, die die Zustände in den jeweiligen GroupBoxen repräsentieren. Diese könntest du über CheckedChanged wieder automatisch aktualisieren lassen. Das ist aber wieder sehr undynamisch.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 23. August 2013 08:30
    Moderator

Alle Antworten

  • Hallo,'
    mit was arbeitest du denn genau? WinForms/WPF/...? Die nachfolgenden Codes funktionieren in Windows Forms, in WPF müsste man es leicht anpassen.
    Du könntest nun entweder alles manuell abfragen, was dann so aussehen könnte:

    if((gb1_rb1.Checked || gb1_rb2.Checked || gb1_rb3.Checked)
    && (gb2_rb1.Checked || gb2_rb2.Checked || gb2_rb3.Checked)
    && (gb3_rb1.Checked || gb3_rb2.Checked || gb3_rb3.Checked))
    {//...

    Was natürlich nicht unbedingt schön oder dynamisch ist.

    Nun könntest du aber auch alle GroupBox'en durchgehen und die RadioButtons abfragen ob min. einer gecheckt ist. Das könnte man so machen:

                foreach(Control c in this.Controls)//Alle Controls durchgehen
                {
                    if(c is GroupBox)//Nur GroupBoxen auswählen, ggf. noch die Namen abprüfen
                    {
                        bool b = false;//Auf true setzen, sobald gecheckter RB gefunden wurde
                        foreach(Control rb in c.Controls)//Alle Controls in den GroupBoxen durchgehen
                        {
                            if(rb is RadioButton)//Nur RadioButtons)
                            {
                                if((rb as RadioButton ).Checked)
                                {
                                    b = true;//Gecheckten gefunden
                                    break;//Schleife unterbrechen
                                }
                            }
                        }
                        if(!b)//Ein GroupBox ohne gechekctem RB gefunden
                        {
                            checkBox1.Checked = false;
                            return;//Damit =true anweisung zum schluss nicht mehr ausgeführt werden kann
                        }
                    }
                }
                checkBox1.Checked = true;//Überall einen gecheckten RB gefunden

    Der Code mag zwar länger sein, aber die GUI ist deutlich einfacher zu erweitern. Wie immer habe ich den Code weitestgehend kommentiert.

    Um den Code jedesmal aufzurufen, wenn ein RadioButton sich ändert, musst du das CheckedChanged-Event abfangen und dann den Code aufrufen.

    Nun könntest du aber auch noch Felder/Eigenschaften erstellen, die die Zustände in den jeweiligen GroupBoxen repräsentieren. Diese könntest du über CheckedChanged wieder automatisch aktualisieren lassen. Das ist aber wieder sehr undynamisch.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 23. August 2013 08:30
    Moderator
  • Danke nochmals, aber irgendwie nimmt er das bedingte OR 

    ||   nicht an?!
    Freitag, 23. August 2013 11:24
  • Ich nehme mal an, das du von meiner 1. Möglichkeit redest. Woran genau scheitert es denn? Ich habe es gerade nochmal gestestet und es funktioniert bei mir. (Im 2012er und 2008er VS)

    Gibt es einen Compilerfehler oder einen Laufzeitfehler? Stacktrace?

    Setze mal einen BreakPoint (F9) bei der if-Abfrage um die Wrete mal manuell zu prüfen.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 23. August 2013 11:37
    Moderator
  • Ok bin weitergekommen, es sieht jetzt so aus bei mir:

    CB_B.Checked

    if((RB_B1L.Checked || RB_B1W.Checked || RB_B1B.Checked)

    && (RB_B2A.Checked || RB_B2B.Checked || RB_B2C.Checked)

    && (RB_B3J.Checked || RB_B3N.Checked || RB_B3R.Checked)

    && (RB_B4J.Checked || RB_B4N.Checked || RB_B4R.Checked)

    && (RB_B5J.Checked || RB_B5N.Checked || RB_B5R.Checked)

    && (RB_B6J.Checked || RB_B6N.Checked || RB_B6R.Checked)

    && (RB_B7J.Checked || RB_B7N.Checked || RB_B7R.Checked)

    && (RB_B8J.Checked || RB_B8N.Checked || RB_B8R.Checked))                                                      Das Problem ist jetzt nur dass er meine CheckBox CB_B nicht an nimmt. Danke nochmal :-D

    Freitag, 23. August 2013 12:17
  • So wie der Code gerade da steht ist es syntaktisch schonmal falsch. Die CheckBox musst du entweder in dert if-Abfrage setzen oder direkt diese rießige Abfrage zuweisen:
    CB_B.Checked =
         (RB_B1L.Checked || RB_B1W.Checked || RB_B1B.Checked)
      && (RB_B2A.Checked || RB_B2B.Checked || RB_B2C.Checked)
      && (RB_B3J.Checked || RB_B3N.Checked || RB_B3R.Checked)
      && (RB_B4J.Checked || RB_B4N.Checked || RB_B4R.Checked)
      && (RB_B5J.Checked || RB_B5N.Checked || RB_B5R.Checked)
      && (RB_B6J.Checked || RB_B6N.Checked || RB_B6R.Checked)
      && (RB_B7J.Checked || RB_B7N.Checked || RB_B7R.Checked)
      && (RB_B8J.Checked || RB_B8N.Checked || RB_B8R.Checked);
    Dann sollte es eigentlich gehen.
    Zur Erklärung: Diese Abfrage liefert am ende einen Booleanschen Wert (bool) zurück. Die if-Abfrage kann dann anhand des Wertes (true/false) bestimmen ob der if oder der else-Block ausgeführt werden soll.
    Den Booleanschen Wert kannst du aber auch direkt zuweisen. Dafür kannst du dann auch die "Randklammern", welche if braucht, weglassen.

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 23. August 2013 12:28
    Moderator
  • Alles klar habs hinbekommen. Vielen Dank!!!!
    Freitag, 23. August 2013 13:00
  • Doch noch nicht ganz^^.

    Es tut mir leid es ist Freitag Nachmittag aber ich hätte gerne dass in der CheckBox automatisch ein Häkchen

    erscheint wenn jeweils einer der RadioButtons ausgewählt ist, also die Liste vollständig ist. Das war dann auch

    meine letzte Frage versprochen :-D

    Freitag, 23. August 2013 13:19
  • Um den Code jedesmal aufzurufen, wenn ein RadioButton sich ändert, musst du das CheckedChanged-Event abfangen und dann den Code aufrufen.
    Am besten packst du den Code dafür in eine Methode. Du kannst für alle RadioButtons den selben Handler registrieren.

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 23. August 2013 13:36
    Moderator
  • Also muss ich dann folgendes für jeden einzelnen RadioButton schreiben?

    privatevoid radioButton1_CheckedChanged(Object sender,
                                             EventArgs e)
    {
       if (radioButton1.CheckAlign == ContentAlignment.MiddleLeft)
       {
          radioButton1.CheckAlign = ContentAlignment.MiddleRight;
       }
       else
       {
          radioButton1.CheckAlign = ContentAlignment.MiddleLeft;
       }
    }

    Und was genau hat das MiddleLeft und MiddleRight zu bedeuten?

    Montag, 26. August 2013 07:45
  • Den Eventhandler brauchst du nur einmal. Du musst nur den selben Handler für jeden RadioButton verwenden. Der Code sieht dann in etwa so aus:

    this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged);
    this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged);
    this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged);

    Oder du benutzt den Designer. Dazu kannst du auch alle Radiobuttons auswählen (Strg + Klick auf jeden Radiobutton), dann drückst du F4 um schließlich im Eigenschaftenfenster in die Events zu gehen udn überall den selben Eventhandler zuzuweisen:

    In dem sender-Parameter wird dann das Control gespeichert, welches das Event ausgelöst hat.

            private void radioButton_CheckedChanged(object sender, EventArgs e)
            {
                if ((sender as RadioButton).CheckAlign == ContentAlignment.MiddleLeft)
                {
                    (sender as RadioButton).CheckAlign = ContentAlignment.MiddleRight;
                }
                else
                {
                    (sender as RadioButton).CheckAlign = ContentAlignment.MiddleLeft;
                }
            }

    Zu der CheckedAlign-Eigenschaft
    Hast du denn mal versucht die Änderung zu entdecken?

    Den Sinn des CheckedAlign-Zuweisens verstehe ich zwar nicht so recht, aber die Auswirkungen solltest du sehen.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Montag, 26. August 2013 09:58
    Moderator
  • Es funktioniert!!!! Ja viel enDank nochmal warst mir eine sehr große Hilfe!

    Mfg John

    Montag, 26. August 2013 11:42