Laden...

Radio Button als Gruppe abfragen

Erstellt von Marc_Core vor einem Jahr Letzter Beitrag vor einem Jahr 786 Views
M
Marc_Core Themenstarter:in
7 Beiträge seit 2021
vor einem Jahr
Radio Button als Gruppe abfragen

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.

16.807 Beiträge seit 2008
vor einem Jahr

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

Je nachdem gibts Gruppierungsmöglichkeiten, oder eben nicht.

3.825 Beiträge seit 2006
vor einem Jahr

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

T
50 Beiträge seit 2014
vor einem Jahr

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...

2.078 Beiträge seit 2012
vor einem Jahr

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.

4.931 Beiträge seit 2008
vor einem Jahr

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!).

2.078 Beiträge seit 2012
vor einem Jahr

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.

4.931 Beiträge seit 2008
vor einem Jahr

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;
  }
}

2.078 Beiträge seit 2012
vor einem Jahr

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 😁

4.931 Beiträge seit 2008
vor einem Jahr

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).

2.078 Beiträge seit 2012
vor einem Jahr

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?

D
261 Beiträge seit 2015
vor einem Jahr

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.

2.078 Beiträge seit 2012
vor einem Jahr

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.

4.931 Beiträge seit 2008
vor einem Jahr

Ja, das habe ich so gemeint:

... 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).

3.825 Beiträge seit 2006
vor einem Jahr
  
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

16.807 Beiträge seit 2008
vor einem Jahr

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.

2.078 Beiträge seit 2012
vor einem Jahr

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.