it-swarm.com.de

Welches Optionsfeld in der Gruppe ist markiert?

WinForms verwenden; Gibt es eine bessere Möglichkeit, den geprüften RadioButton für eine Gruppe zu finden? Es scheint mir, dass der folgende Code nicht notwendig sein sollte. Wenn Sie einen anderen RadioButton überprüfen, weiß er, welche deaktiviert werden soll. Er sollte also wissen, welcher aktiviert ist. Wie kann ich diese Informationen abrufen, ohne viele if-Anweisungen (oder einen Schalter) auszuführen.

     RadioButton rb = null;

     if (m_RadioButton1.Checked == true)
     {
        rb = m_RadioButton1;
     }
     else if (m_RadioButton2.Checked == true)
     {
        rb = m_RadioButton2;
     }
     else if (m_RadioButton3.Checked == true)
     {
        rb = m_RadioButton3;
     }
112
Billy

Sie könnten LINQ verwenden:

var checkedButton = container.Controls.OfType<RadioButton>()
                                      .FirstOrDefault(r => r.Checked);

Beachten Sie, dass dies erfordert, dass sich alle Optionsfelder direkt in demselben Container befinden (z. B. Panel oder Formular) und dass sich in dem Container nur eine Gruppe befindet. Ist dies nicht der Fall, können Sie für jede Gruppe List<RadioButton>s in Ihrem Konstruktor erstellen. Schreiben Sie dann list.FirstOrDefault(r => r.Checked).

205
SLaks

Sie können die CheckedEvents aller Tasten mit einem Handler verbinden. Dort kann man leicht die richtige Checkbox bekommen.

// Wire all events into this.
private void AllCheckBoxes_CheckedChanged(Object sender, EventArgs e) {
    // Check of the raiser of the event is a checked Checkbox.
    // Of course we also need to to cast it first.
    if (((RadioButton)sender).Checked) {
        // This is the correct control.
        RadioButton rb = (RadioButton)sender;
    }
}
32
Bobby

Für diejenigen ohne LINQ:

RadioButton GetCheckedRadio(Control container)
{
    foreach (var control in container.Controls)
    {
        RadioButton radio = control as RadioButton;

        if (radio != null && radio.Checked)
        {
            return radio;
        }
    }

    return null;
}
25
João Angelo

Das OP wollte den geprüften RadioButton BY GROUP holen. Die Antwort von @SLaks ist zwar hervorragend, aber nicht wirklich die Hauptfrage des OP. Um die Antwort von @SLaks zu verbessern, gehen Sie einfach einen Schritt weiter.

Hier ist ein Beispiel aus meinem eigenen Arbeitscode. Gemäß einer normalen WPF sind meine RadioButtons in einem Raster (mit dem Namen "myGrid") mit einer Reihe anderer Steuerelemente enthalten. Ich habe zwei verschiedene RadioButton-Gruppen im Grid.

So holen Sie den geprüften RadioButton aus einer bestimmten Gruppe:

List<RadioButton> buttons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
      .Where(r => r.GroupName == "GroupName" && r.IsChecked)
      .Single();

Wenn für Ihren Code die Möglichkeit besteht, dass keine RadioButtons geprüft werden, verwenden Sie "SingleOrDefault ()". (Wenn ich keine Tri-State-Buttons verwende, dann setze ich immer einen Button "IsChecked" als Standardauswahl.)

10
D'Hag

Sie können das Ereignis CheckedChanged für alle Ihre RadioButtons verwenden. Sender werden die ungeprüften und geprüften RadioButtons sein.

5
tanascius

Neben der CheckedChangedEvent-Verkabelung könnte man die Controls-Eigenschaft "Tag" verwenden, um zwischen den Optionsfeldern zu unterscheiden ... Eine Alternative (Spaghetti-Code) wäre die Eigenschaft "TabIndex"; P

1

In solchen Situationen vermisse ich manchmal meine Jugend, wenn Access mein Gift der Wahl war, und ich konnte jedem Radioknopf in einer Gruppe einen eigenen Wert zuweisen.

Mein Hack in C # besteht darin, den Wert zum Festlegen des Werts zu verwenden, und wenn ich eine Auswahl aus der Gruppe auswähle, lese ich den Wert des Tags des ausgewählten Radiobuttons. In diesem Beispiel ist directionGroup die Gruppe, in der ich vier fünf Optionsfelder mit "None" und "NE", "SE", "NW" und "SW" als Tags auf den anderen vier Radiobuttons habe.

Ich habe proaktiv eine Schaltfläche verwendet, um den Wert der aktivierten Schaltfläche zu erfassen, da die Zuweisung einer Schaltfläche für alle CHeckCHanged -Ereignisse aller Schaltflächen dazu führt, dass jede Taste ausgelöst wird. Der Wert des Senders ist also immer der erste RadioButton in der Gruppe. Stattdessen verwende ich diese Methode, wenn ich herausfinden muss, welche ausgewählt ist. Die Werte werden in der Tag-Eigenschaft jedes RadioButton-Objekts abgerufen.

  private void ShowSelectedRadioButton()
    {
        List<RadioButton> buttons = new List<RadioButton>();
        string selectedTag = "No selection";
        foreach (Control c in directionGroup.Controls)
        {
            if (c.GetType() == typeof(RadioButton))
            {
                buttons.Add((RadioButton)c);
            }
        }
        var selectedRb = (from rb in buttons where rb.Checked == true select rb).FirstOrDefault();
        if (selectedRb!=null)
        {
             selectedTag = selectedRb.Tag.ToString();
        }

        FormattableString result = $"Selected Radio button tag ={selectedTag}";
        MessageBox.Show(result.ToString());
    }

Zu Ihrer Information, ich habe dies in meiner Arbeit getestet und verwendet.

Joey

1
Joseph Morgan

Sie können eine Extension-Methode verwenden, um die Parent.Controls-Auflistung von RadioButton zu durchlaufen. Damit können Sie andere RadioButtons im selben Bereich abfragen. Mit zwei Erweiterungsmethoden können Sie mit der ersten Methode bestimmen, ob RadioButtons in der Gruppe ausgewählt sind, und dann mit der zweiten Option die Auswahl treffen. Das Feld RadioButton-Tag kann verwendet werden, um ein Enum zu speichern, um jeden RadioButton in der Gruppe zu identifizieren:

    public static int GetRadioSelection(this RadioButton rb, int Default = -1) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return Int32.Parse((string)r.Tag);
        }
        return Default;
    }

    public static bool IsRadioSelected(this RadioButton rb) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return true;
        }
        return false;
    }

Hier ist ein typisches Verwendungsmuster:

if(!MyRadioButton.IsRadioSelected()) {
   MessageBox.Show("No radio selected.");
   return;
}
int selection = MyRadioButton.GetRadioSelection;
1
James McManus

Wenn Sie den Index des ausgewählten Optionsfelds in einem Steuerelement abrufen möchten, können Sie diese Methode verwenden:

public static int getCheckedRadioButton(Control c)
{
    int i;
    try
    {
        Control.ControlCollection cc = c.Controls;
        for (i = 0; i < cc.Count; i++)
        {
            RadioButton rb = cc[i] as RadioButton;
            if (rb.Checked)
            {
                return i;
            }
        }
    }
    catch
    {
        i = -1;
    }
    return i;
}

Anwendungsbeispiel:

int index = getCheckedRadioButton(panel1);

Der Code ist nicht so gut getestet, aber es scheint, als sei die Indexreihenfolge von links nach rechts und von oben nach unten wie beim Lesen eines Textes. Wenn kein Optionsfeld gefunden wird, gibt die Methode -1 zurück.

Update: Es stellte sich heraus, dass mein erster Versuch nicht funktioniert hat, wenn sich kein Optionsfeld im Steuerelement befindet. Ich habe einen try and catch-Block hinzugefügt, um das zu beheben, und die Methode scheint nun zu funktionieren.

0
matsolof

wenn du die auswahl in datei oder irgendetwas speichern willst und später rufe, hier was ich mache

string[] lines = new string[1];

lines[0]  = groupBoxTes.Controls.OfType<RadioButton>()
            .FirstOrDefault(r => r.Checked).Text;

File.WriteAllLines("Config.ini", lines);

dann ruf es mit an

string[] ini = File.ReadAllLines("Config.ini");
groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => (r.Text == ini[0])).Checked = true;
0
ewwink

Die GroupBox verfügt zu diesem Zweck über ein validiertes Ereignis, wenn Sie WinForms verwenden.

private void grpBox_Validated(object sender, EventArgs e)
    {
        GroupBox g = sender as GroupBox;
        var a = from RadioButton r in g.Controls
                 where r.Checked == true select r.Name;
        strChecked = a.First();
     }
0

Für Entwickler, die VB.NET verwenden


Private Function GetCheckedRadio(container) As RadioButton
    For Each control In container.Children
        Dim radio As RadioButton = TryCast(control, RadioButton)

        If radio IsNot Nothing AndAlso radio.IsChecked Then
            Return radio
        End If
    Next

    Return Nothing
End Function
0
Nick4814