मैं विंडोज फॉर्म रेडियो बटन कैसे समूहित करूं?


315

मैं विंडोज फॉर्म एप्लिकेशन (ASP.NET के रेडियोबूटटोनलिस्ट की तरह बहुत कुछ) में रेडियो बटन कैसे समूहित कर सकता हूं!

इसलिए मैं विकल्पों में से चुने गए प्रत्येक मामले के बीच स्विच कर सकता हूं।



स्क्रीनशॉट देखें: stackoverflow.com/a/46424314/984780
लुइस पेरेज़

जवाबों:


425

एक कंटेनर ऑब्जेक्ट में समूह के लिए सभी रेडियो बटन लगाएं जैसे a Panelया a GroupBox। यह स्वचालित रूप से उन्हें विंडोज फॉर्म में एक साथ समूहीकृत करेगा।


13
@mohammadsadeghsaati सवाल विंडोज फॉर्म रेडियोबटन के बारे में था, यह ग्रुपनेम प्रॉपर्टी को उजागर नहीं करता है।
UweB

2
@ यूवीबी क्या होगा अगर मैं किसी समस्या के कारण ग्रुप बॉक्स और पैनल जोड़ सकता हूं तो मुझे बताएं कि मेरे फॉर्म पर ज्यादा जगह नहीं है। फिर?
मुहम्मद साकिब

2
@MuhammadSaqib यह असंभव है क्योंकि पैनल शून्य-आकार के हो सकते हैं। मेरा मतलब है कि अदृश्य सीमाओं और बिना मार्जिन वाले पैनल सादे रूप में समान हैं। बस सही पैनल का उपयोग करें - TableLayoutPanel यदि आपको टेबल आदि में समूह बनाना चाहिए
एलेक्स

38

अपने रेडियो बटन को ग्रुपबॉक्स में रखकर देखें ।


1
GroupBox रेडियो बटन से पूरी तरह से असंबंधित है। कोई भी कंटेनर करेगा।
usr

30

आपको समूह के सभी रेडियो बटन को एक ही कंटेनर जैसे GroupBox या पैनल के अंदर रखना चाहिए।


1
यह तब जटिल हो जाता है जब आपको नेस्टेड पैनलों की परतें मिली हों, जैसे कि जब आप ऐसा कुछ करने की कोशिश कर रहे हों जो इस तरह दिखता है । रेडियो बटन अपने माता-पिता के साथ संघर्ष करते हैं।
एजी हैमरथिफ़

24

मुझे WPF में RadioButtons को समूहीकृत करने की अवधारणा पसंद है। एक संपत्ति है GroupNameजो निर्दिष्ट करती है कि रेडियोबॉटन नियंत्रण परस्पर अनन्य हैं ( http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx )।

इसलिए मैंने इस सुविधा का समर्थन करने वाले WinForms के लिए एक व्युत्पन्न वर्ग लिखा:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Windows.Forms.VisualStyles;
using System.Drawing;
using System.ComponentModel;

namespace Use.your.own
{
    public class AdvancedRadioButton : CheckBox
    {
        public enum Level { Parent, Form };

        [Category("AdvancedRadioButton"),
        Description("Gets or sets the level that specifies which RadioButton controls are affected."),
        DefaultValue(Level.Parent)]
        public Level GroupNameLevel { get; set; }

        [Category("AdvancedRadioButton"),
        Description("Gets or sets the name that specifies which RadioButton controls are mutually exclusive.")]
        public string GroupName { get; set; }

        protected override void OnCheckedChanged(EventArgs e)
        {
            base.OnCheckedChanged(e);

            if (Checked)
            {
                var arbControls = (dynamic)null;
                switch (GroupNameLevel)
                {
                    case Level.Parent:
                        if (this.Parent != null)
                            arbControls = GetAll(this.Parent, typeof(AdvancedRadioButton));
                        break;
                    case Level.Form:
                        Form form = this.FindForm();
                        if (form != null)
                            arbControls = GetAll(this.FindForm(), typeof(AdvancedRadioButton));
                        break;
                }
                if (arbControls != null)
                    foreach (Control control in arbControls)
                        if (control != this &&
                            (control as AdvancedRadioButton).GroupName == this.GroupName)
                            (control as AdvancedRadioButton).Checked = false;
            }
        }

        protected override void OnClick(EventArgs e)
        {
            if (!Checked)
                base.OnClick(e);
        }

        protected override void OnPaint(PaintEventArgs pevent)
        {
            CheckBoxRenderer.DrawParentBackground(pevent.Graphics, pevent.ClipRectangle, this);

            RadioButtonState radioButtonState;
            if (Checked)
            {
                radioButtonState = RadioButtonState.CheckedNormal;
                if (Focused)
                    radioButtonState = RadioButtonState.CheckedHot;
                if (!Enabled)
                    radioButtonState = RadioButtonState.CheckedDisabled;
            }
            else
            {
                radioButtonState = RadioButtonState.UncheckedNormal;
                if (Focused)
                    radioButtonState = RadioButtonState.UncheckedHot;
                if (!Enabled)
                    radioButtonState = RadioButtonState.UncheckedDisabled;
            }

            Size glyphSize = RadioButtonRenderer.GetGlyphSize(pevent.Graphics, radioButtonState);
            Rectangle rect = pevent.ClipRectangle;
            rect.Width -= glyphSize.Width;
            rect.Location = new Point(rect.Left + glyphSize.Width, rect.Top);

            RadioButtonRenderer.DrawRadioButton(pevent.Graphics, new System.Drawing.Point(0, rect.Height / 2 - glyphSize.Height / 2), rect, this.Text, this.Font, this.Focused, radioButtonState);
        }

        private IEnumerable<Control> GetAll(Control control, Type type)
        {
            var controls = control.Controls.Cast<Control>();

            return controls.SelectMany(ctrl => GetAll(ctrl, type))
                                      .Concat(controls)
                                      .Where(c => c.GetType() == type);
        }
    }
}

3
यह मेरे लिए एक ऐसी स्थिति में काम आया जहां मुझे एक TableLayoutPanel के अंदर एक समूह में RadioButtons की आवश्यकता थी - धन्यवाद!
20

मैं अपने स्वयं के रूपों में से एक के लिए इस वर्ग का उपयोग करने की कोशिश कर रहा हूं, लेकिन समूह बॉक्स के शीर्ष पर प्रदर्शित करने के लिए नियंत्रण प्राप्त करने में परेशानी हो रही है (जैसे कि यह समूह बॉक्स का शीर्षक है)। यह शीर्ष-स्तरीय रेडियो बटन ( आईडी एस्ट) के रूप में सेवा करने के लिए है , इस रेडियो बटन के लिए समूह प्रपत्र के मूल में एक पैनल है और समूह बॉक्स एक भाई है)। क्या इस वर्ग का उपयोग करने के लिए कोई उदाहरण कोड है जिसे प्राप्त करने के लिए?
एजी हैमरथिफ़

मैं IEnumerable<Control> arbControls = null;गतिशील का उपयोग करने के बजाय लिखूंगा । varमास्क यह और भी है, और यही कारण है कि मैं सामान्य रूप से मेरी कोड में केवल स्पष्ट प्रकार का उपयोग की। अन्यथा, बहुत अच्छी नौकरी, और इसे साझा करने के लिए बहुत बहुत धन्यवाद! +1
s Sepunıɔ ɐ qɐp

11

पैनल के बिना रेडियो बटन

public class RadioButton2 : RadioButton
{
   public string GroupName { get; set; }
}

private void RadioButton2_Clicked(object sender, EventArgs e)
{
    RadioButton2 rb = (sender as RadioButton2);

    if (!rb.Checked)
    {
       foreach (var c in Controls)
       {
           if (c is RadioButton2 && (c as RadioButton2).GroupName == rb.GroupName)
           {
              (c as RadioButton2).Checked = false;
           }
       }

       rb.Checked = true;
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    //a group
    RadioButton2 rb1 = new RadioButton2();
    rb1.Text = "radio1";
    rb1.AutoSize = true;
    rb1.AutoCheck = false;
    rb1.Top = 50;
    rb1.Left = 50;
    rb1.GroupName = "a";
    rb1.Click += RadioButton2_Clicked;
    Controls.Add(rb1);

    RadioButton2 rb2 = new RadioButton2();
    rb2.Text = "radio2";
    rb2.AutoSize = true;
    rb2.AutoCheck = false;
    rb2.Top = 50;
    rb2.Left = 100;
    rb2.GroupName = "a";
    rb2.Click += RadioButton2_Clicked;
    Controls.Add(rb2);

    //b group
    RadioButton2 rb3 = new RadioButton2();
    rb3.Text = "radio3";
    rb3.AutoSize = true;
    rb3.AutoCheck = false;
    rb3.Top = 80;
    rb3.Left = 50;
    rb3.GroupName = "b";
    rb3.Click += RadioButton2_Clicked;
    Controls.Add(rb3);

    RadioButton2 rb4 = new RadioButton2();
    rb4.Text = "radio4";
    rb4.AutoSize = true;
    rb4.AutoCheck = false;
    rb4.Top = 80;
    rb4.Left = 100;
    rb4.GroupName = "b";
    rb4.Click += RadioButton2_Clicked;
    Controls.Add(rb4);
}


5

GroupBoxबेहतर है। लेकिन न केवल समूह बॉक्स, यहां तक ​​कि आप उपयोग कर सकते हैं Panels( System.Windows.Forms.Panel)।

  • यह बहुत उपयोगी है जब आप इंटरनेट प्रोटोकॉल संस्करण 4 सेटिंग संवाद डिजाइन कर रहे हैं। (अपने पीसी (विंडोज़) के साथ इसे जांचें, तो आप व्यवहार कर सकते हैं)

5

एक शेयर कंटेनर के अंदर सभी रेडियो बटन एक ही समूह में हैं डिफ़ॉल्ट रूप में हैं । मतलब, अगर आप उनमें से एक की जाँच करते हैं - तो दूसरे अनियंत्रित होंगे। यदि आप रेडियो बटनों के स्वतंत्र समूह बनाना चाहते हैं, तो आपको उन्हें अलग-अलग कंटेनरों में वर्गीकृत करना चाहिए Group Box, या पीछे कोड के माध्यम से उनकी जाँच की स्थिति को नियंत्रित करना चाहिए ।


4

यदि आप उन्हें एक कंटेनर में नहीं डाल सकते हैं, तो आपको प्रत्येक रेडियोबटन की जाँच की गई स्थिति को बदलने के लिए कोड लिखना होगा :

private void rbDataSourceFile_CheckedChanged(object sender, EventArgs e)
{
    rbDataSourceNet.Checked = !rbDataSourceFile.Checked;
}

private void rbDataSourceNet_CheckedChanged(object sender, EventArgs e)
{
  rbDataSourceFile.Checked = !rbDataSourceNet.Checked;
}

यह आपको अनंत पाश में डाल देगा,,
माइकल सैंडलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.