Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Radio Button als Gruppe abfragen
Marc_Core
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

Radio Button als Gruppe abfragen

beantworten | zitieren | melden

Hallo Leute,
ich hoffe ihr könnt mit helfen.

Ich habe Radio Button in einer GroupBox platziert.
Ich möchte die Abfragen welcher aktiviert ist.

Wie kann ich das machen, ohne von jedem RB eine Checked_Change Event zu erstellen.

Danke euch.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.832

beantworten | zitieren | melden

Willst den Leuten auch verraten, mit welcher UI Technologie Du arbeitest?
ASP.NET? WinForms? WPF? UWP...?

Je nachdem gibts Gruppierungsmöglichkeiten, oder eben nicht.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.764
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden


Wenn die Radiobuttons einen Namen haben kannst Du sie direkt abfragen :


string mission = "";
if (radioButton1.Checked)  mission = "Einsatz";
if (radioButton2.Checked)  mission = "Pause";

oder


string mission = "";
if (radioButton1.IsChecked)  mission = "Einsatz";
if (radioButton2.IsChecked)  mission = "Pause";

Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
private Nachricht | Beiträge des Benutzers
Torni
myCSharp.de - Member



Dabei seit:
Beiträge: 50

beantworten | zitieren | melden

Der Thread ist zwar paar Tage alt aber ne andere Möglichkeit über das Event der GroupBox:


        private void groupBox2_Validated(object sender, EventArgs e)
        {
            GroupBox g = sender as GroupBox;
            var a = from System.Windows.Forms.RadioButton r in g.Controls
                    where r.Checked == true
                    select r.Name;
            MessSystem = a.First();//Text des ausgewählten RadioB in den string MessSystem packen
        }

p.s. steinigt mich, wenn das "böse" ist aber es funktioniert super...
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Ich sähe da lieber ein FirstOrDefault + das Verhalten beim Default.
Auch wenn das beim RadioButton eigentlich nicht geht, ist der Code so etwas robuster.
Außerdem funktioniert das nur so lange, wie die Controls auch RadioButtons sind, sobald man da z.B. nochmal was drum legt, scheitert es.
Und bei so einfachen Queries würde ich die Methoden-Syntax nehmen, aber das sieht jeder anders.

Diese Art - also direkt auf die Controls zugreifen - ist aber eigentlich nur bei WinForms vernünftig.
Z.B. bei WPF und UPW gibt's MVVM und DataBinding, damit löst sich das ganze Problem aus dem Stand in Luft auf.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Für WinForms s.a. die Antworten von xxMUROxx in Viele RadioButtons auf checked = true prüfen, also eine CheckedChanged-Ereignismethode für alle RadioButtons (einer RadioGroup) benutzen und den sender abfragen (viel effektiver als das Durchlaufen aller untergeordneten Controls!).
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Das funktioniert aber nur, wenn es nur zwei RadioButtons gibt.
In dem Fall könnte man auf den jeweils Anderen schließen, aber bei 3 oder mehr geht das nicht mehr.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Was meinst du mit "auf den jeweils anderen schließen"?
Das geht bei beliebig vielen:


if (sender is RadioButton rb)
{
  if (rb.Checked)
  {
     SelectedRadioButton = rb;
  }
}
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Ok, dann habe ich dich falsch verstanden, aber das Problem bleibt.

Ich versuche es zu verdeutlichen:

RB1 => true => CheckedChanged-Handler registriert
RB2 => false
RB3 => false

Klicke ich nun auf RB2:

RB1 => false => CheckedChanged-Handler wird ausgeführt
RB2 => true
RB3 => false

Klicke ich nun auf RB3:

RB1 => false => CheckedChanged-Handler wird nicht ausgeführt
RB2 => false
RB3 => true

Und mit "auf den jeweils anderen schließen" meine ich:

RB1 => true => RB2 muss false sein
RB2 => false => RB1 muss true sein

In dem Fall würde ein CheckedChanged-Handler ausreichen, denn egal welchen der beiden Buttons ich anklicke, wird dieser Handler immer ausgeführt, weil eine Änderung immer den anderen Button betrifft. Und im Handler kann ich mir dann den Checked-Status anschauen und weiß damit automatisch den Zustand des anderen Buttons.
Aber klar, man kann ja auch einfach die Referenzen der Anderen angucken - so weit hab ich irgendwie nicht gedacht
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Ja, aber wo ist das Problem, daß die CheckedChanged-Methode nur für zwei der RadioButtons dann ausgeführt wird? Es ist ja immer nur genau 1 der RadioButtons in einer RadioGroup aktiviert (Checked) und diese Referenz möchte man speichern (oder aber direkt eine Aktion dafür ausführen).
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Weil bei drei oder mehr RadioButtons der Handler nicht bei jeder Änderung ausgeführt wird, der wird ja nur ausgeführt, wenn sich auch wirklich der Checked-Zustand ändert, weil bei drei oder mehr RadioButtons nicht immer der Fall ist. Bei drei RadioButtons bräuchte man also zwei Handler und bei vier Buttons braucht man drei Handler.

Oder wird der Handler von RB1 (in meinem Beispiel) auch ausgerufen, wenn er selber sich gar nicht ändert, sondern nur RB2 und RB3?
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 217

beantworten | zitieren | melden

Es braucht nicht jeder RadioButton einen eigenen Eventhandler. Einfach den selben nehmen und durch den Code von Th69 funktioniert es dann trotzdem.
Eventhandler nur an einen Teil von (RadioButton)-Controls hängen wäre für mich ein Code-Smell.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Hat das Th69 gemeint?
Ok, dann haben wir aneinander vorbei geredet
Ich dachte, nur auf das Event von einem RadioButton horchen.

Aber klar, eine Methode an das Event von allen RadioButtons hängen, funktioniert natürlich.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Ja, das habe ich so gemeint:
Zitat von "Th69"
... also eine CheckedChanged-Ereignismethode für alle RadioButtons (einer RadioGroup) benutzen ...
Statt "benutzen" hätte ich wohl besser "abonnieren" schreiben sollen (aber ich weiß nicht, ob der OP das direkt so verstanden hätte).
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.764
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

Zitat von BerndFfm


string mission = "";
if (radioButton1.Checked)  mission = "Einsatz";
if (radioButton2.Checked)  mission = "Pause";

Mein Beispielcode kann in einem gemeinsamen Eventhandler stehen oder in einer Routine die die Auswahl verarbeitet, z.B. eine Save-Routine.

Es ist auf jeden Fall sinnvoll den Code robust zu gestalten wie schon oben geschrieben wurde.

So wie ich bei einem alten Röhrenradio alle Tasten gleichzeitig runterdrücken kann (wer hat das als Kind nicht probiert wer in meinem Alter ist) kann man auch nicht ausschließen dass kein Radiobutton aktiv ist oder mehrere (Falsche Groupbox etc.)

Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.832

beantworten | zitieren | melden

Kann Dir bei den Events in diesem Fall auch nicht passieren, weil es hier kein "Gleichzeitig drücken" technisch geben kann.
Überall die Radio-Buttons manuell abfragen widerspricht vielen Prinzipien (KISS, SPOT, DRY..) und hat keinerlei Vorteile - im Gegenteil: hoher Wartungsaufwand und Anfälligkeit.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Ich persönlich würde in dem Event-Handler die Radio-Buttons (ob alle oder nur die Relevanten) abfragen und die ausgewählten Radio-Buttons auf ein Enum mappen.
Damit kann man dann andere Methoden aufrufen oder den Zustand anpassen und man muss sich nicht mehr um die Radio-Buttons kümmern.

Mit MVVM und WPF (oder andere ähnliche Frameworks) wäre das natürlich um einiges einfacher, aber es wurde ja nicht mitgeteilt, um was es sich handelt.
private Nachricht | Beiträge des Benutzers