Benutzer mit den meisten Antworten
Visual Studio 2008 C# Checkbox soll abgehakt sein wenn alles ausgefüllt ist

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 :)
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.- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Freitag, 23. August 2013 10:13
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.- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Freitag, 23. August 2013 10:13
-
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. -
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
-
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. -
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
-
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. -
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?
-
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.