समूह में कौन सा रेडियो बटन चेक किया गया है?


118

WinForms का उपयोग करना; क्या एक समूह के लिए चेक किए गए रेडियोबटन को खोजने का एक बेहतर तरीका है? मुझे ऐसा लगता है कि नीचे दिया गया कोड आवश्यक नहीं होना चाहिए। जब आप एक अलग RadioButton की जाँच करते हैं तो यह पता चलता है कि किसको अनचेक करना है ... इसलिए यह पता होना चाहिए कि कौन सा चेक किया गया है। यदि बहुत सारे कथन (या एक स्विच) किए बिना मैं उस जानकारी को कैसे खींचूं।

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

1
अंतर्निहित कोड को नहीं पता है कि कौन सा अनचेक करना है, यह सिर्फ बदले हुए नियंत्रण के एक ही माता-पिता के नीचे सभी रेडियोबटन नियंत्रणों को पुनरावृत्त करता है और पहले से चेक किए गए एक को अनचेक करता है।
जोआ एंजेलो

1
क्या आप WinForms या ASP.Net का उपयोग कर रहे हैं?
SLACs

जवाबों:


219

आप LINQ का उपयोग कर सकते हैं:

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

ध्यान दें कि इसके लिए यह आवश्यक है कि सभी रेडियो बटन सीधे एक ही कंटेनर (जैसे, पैनल या फॉर्म) में हों, और कंटेनर में केवल एक समूह हो। यदि ऐसा नहीं है, तो आप List<RadioButton>प्रत्येक समूह के लिए अपने कंस्ट्रक्टर में s बना सकते हैं , फिर लिखें list.FirstOrDefault(r => r.Checked)


क्या s.FirstOrDefaultइसके बजाय list.FirstOrDefaultआपके उत्तर के दूसरे पैराग्राफ में होना चाहिए ?

@Phoenix: sएक बहुवचन है, एक चर नाम नहीं है।
SLKs

उत्कृष्ट उत्तर, लेकिन वास्तव में ओपी के मुख्य प्रश्न का उत्तर नहीं दिया। मेरा जवाब देखिए।
D'Hag

आपके लिए vb.net लोग, मैं आपको टेलरिक कनवर्टर की एक यात्रा बचाऊंगा: मंद चेकबटन = radConnections.Controls.OfType (RadioButton की) ()। FirstOrDefault (फ़ंक्शन (r) r.Checked)
JoshYates1980

36

आप एक हैंडलर के खिलाफ सभी बटन के CheckedEvents तार कर सकते हैं । वहां आप आसानी से सही चेकबॉक्स प्राप्त कर सकते हैं।

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

इस के बजाय होना चाहिए - अगर (((RadioButton) प्रेषक) .Checked)
फ्रैंक Tzanabetis

1
WPF के RadioButton में कोई CheckedChanged नहीं है, आपको यह कहाँ से मिला?
मुराफ सूसली

26

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

12

ओपी ग्रुप रेडियोबोटन बाय ग्रुप की जाँच करवाना चाहता था। जबकि @SLaks का उत्तर उत्कृष्ट है, यह वास्तव में ओपी के मुख्य प्रश्न का उत्तर नहीं देता है। @SLaks के उत्तर में सुधार करने के लिए, बस LINQ को एक कदम आगे ले जाएं।

यहाँ मेरे अपने काम कोड से एक उदाहरण है। सामान्य WPF के अनुसार, मेरे Gridरेडियोबटन अन्य प्रकार के नियंत्रणों के एक समूह के साथ ("myGrid" नाम दिए गए) में निहित हैं । ग्रिड में मेरे दो अलग-अलग रेडियोबटन समूह हैं।

किसी विशेष समूह से रेडियोबूटन की जाँच करने के लिए:

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

यदि आपके कोड में किसी भी RadioButtons की जांच होने की संभावना है, तो उपयोग करें SingleOrDefault()(यदि मैं त्रि-राज्य बटन का उपयोग नहीं कर रहा हूं, तो मैं हमेशा डिफ़ॉल्ट चयन के रूप में एक बटन "IsChecked" सेट करता हूं।)


1
r.GroupName == "GroupName" और r.IsChecked विभिन्न प्रकार (बूल और बूल?) के हैं, आपको r.IsChecked.Value का उपयोग करना चाहिए, जो कि प्रकार बूल का है।
माइक

1
प्रयास करें .Where(r => r.GroupName == "GroupName" && r.IsChecked == true)क्योंकि r.IsCheckedअशक्त बूल संपत्ति है।
फ़र्ननास

MyGrid यहाँ क्या संदर्भित करता है।
उन्नीकृष्णन

@ माइक आपको बता सकता है कि यहां "रेडियोबटन" क्या है?
बेला स्वान

1
@ बेलास्वान - कोड पर एक नज़र है - आप सभी रेडियो बटन की एक सूची बनाते हैं और इसे एक चर पर असाइन करते हैं। और फिर, उसी चर पर जहां आपको चयन चुनना है और इसे rbTarget को असाइन करना है।
माइक

5

आप अपने सभी RadioButtons के लिए CheckedChanged इवेंट का उपयोग कर सकते हैं । Senderअनियंत्रित और जाँच की जाएगी RadioButtons।


1

आप RadioButton's Parent.Controls संग्रह को पुन: व्यवस्थित करने के लिए एक एक्सटेंशन विधि का उपयोग कर सकते हैं। यह आपको एक ही दायरे में अन्य RadioButtons को क्वेरी करने की अनुमति देता है। दो एक्सटेंशन विधियों का उपयोग करके, आप पहले निर्धारित का उपयोग कर सकते हैं कि क्या समूह में किसी भी रेडियोबटन का चयन किया गया है, फिर चयन प्राप्त करने के लिए दूसरे का उपयोग करें। RadioButton टैग फ़ील्ड का उपयोग समूह में प्रत्येक RadioButton की पहचान करने के लिए Enum को रखने के लिए किया जा सकता है:

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

यहाँ एक विशिष्ट उपयोग पैटर्न है:

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

1

CheckedChangedEvent वायरिंग के अलावा रेडियो बटन के बीच अंतर करने के लिए कंट्रोल्स "टैग" प्रॉपर्टी का उपयोग किया जा सकता है ... (a (स्पेगेटी कोड) विकल्प "TabIndex" प्रॉपर्टी होगा; P


इसका मतलब है कि आप चयनित रेडियोबूटन आईडी (संपत्ति System.Windows.Forms.Control.Tag का उपयोग करते हुए) पर जल्दी से स्विच-केस का उपयोग कर सकते हैं यदि आप बस सवाल को मेरे अलावा नहीं समझते हैं तो कृपया दर न करें।
बिंकान सैलरीमैन

1

कभी-कभी इस तरह की स्थितियों में मुझे अपने युवाओं की याद आती है, जब प्रवेश मेरी पसंद का जहर था, और मैं प्रत्येक रेडियो बटन को अपने स्वयं के मूल्य समूह में दे सकता था।

C # में मेरा हैक मूल्य सेट करने के लिए टैग का उपयोग करना है, और जब मैं समूह से चयन करता हूं, तो मैं चयनित रेडियोबॉटन के टैग का मूल्य पढ़ता हूं। इस उदाहरण में, दिशा समूह वह समूह है जिसमें मेरे पास "कोई नहीं" और "एनई", "एसई", "एनडब्ल्यू" और "एसडब्ल्यू" के साथ चार पांच रेडियो बटन हैं, जो अन्य चार रेडियोबॉटन पर टैग के रूप में हैं।

मैंने नियमित रूप से चेक किए गए बटन के मूल्य को पकड़ने के लिए एक बटन का उपयोग किया है, क्योंकि बटन के सभी के लिए एक ईवेंट हैंडलर को असाइन करने के कारण, CHeckCHanged ईवेंट के कारण EACH बटन को आग लग जाती है, क्योंकि एक बदलने से उन सभी में परिवर्तन होता है। तो प्रेषक का मान हमेशा समूह में पहला रेडियोबटन होता है। इसके बजाय, मैं इस पद्धति का उपयोग करता हूं, जब मुझे यह पता लगाने की आवश्यकता होती है कि कौन सा चुना गया है, उन मूल्यों के साथ जिन्हें मैं प्रत्येक रेडियोबटन के टैग गुण में प्राप्त करना चाहता हूं।

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

FYI करें, मैंने अपने काम में इसका परीक्षण और उपयोग किया है।

एक छोटा सा सिक्का


केवल 'फ़ॉर्मेबलस्ट्रीमिंग' परिणाम को संशोधित करते हुए, मैं अपने प्रोग्राम में कोड का उपयोग करने में सक्षम था। मुझे रेडियोबटन टैग के बारे में भी जानकारी नहीं थी। इस तरह से उत्तर होना चाहिए। महान महोदय।
उन्नीकृष्णन

0

यदि आप चयन को फ़ाइल या किसी अन्य में सहेजना चाहते हैं और बाद में कॉल करते हैं, तो यहां मैं क्या करूं

string[] lines = new string[1];

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

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

इसके बाद इसे कॉल करें

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

0

यदि आप एक नियंत्रण के अंदर चयनित रेडियो बटन का सूचकांक प्राप्त करना चाहते हैं, तो आप इस विधि का उपयोग कर सकते हैं:

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

उदाहरण का उपयोग करें:

int index = getCheckedRadioButton(panel1);

कोड को अच्छी तरह से परीक्षण नहीं किया गया है, लेकिन ऐसा लगता है कि पाठ को पढ़ते समय सूचकांक क्रम बाएं से दाएं और ऊपर से नीचे तक होता है। यदि कोई रेडियो बटन नहीं मिलता है, तो विधि -1 लौटती है।

अद्यतन: यह मेरा पहला प्रयास है अगर नियंत्रण के अंदर कोई रेडियो बटन नहीं है काम नहीं किया। मैंने एक कोशिश और कैच ब्लॉक को ठीक करने के लिए जोड़ा, और विधि अब काम करने लगती है।


0

यदि आप WinForms का उपयोग कर रहे हैं तो GroupBox के पास इस उद्देश्य के लिए एक मान्य घटना है।

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

VB.NET का उपयोग करने वाले डेवलपर्स के लिए


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.