Windows Form radyo düğmelerini nasıl gruplayabilirim?


Yanıtlar:


425

Bir grup için tüm radyo düğmelerini a Panelveya a gibi bir kap nesnesine koyun GroupBox. Bu, onları Windows Forms'da otomatik olarak gruplandıracaktır.


13
@mohammadsadeghsaati Soru Windows Forms RadioButton hakkındaydı, bir GroupName özelliği göstermiyor.
UweB

2
@UweB herhangi bir sorun nedeniyle grup kutuları ve paneller ekleyemezsem formumda fazla yerim olmadığını söyleyeyim. Sonra?
Muhammed Saqib

2
@MuhammadSaqib imkansız çünkü paneller sıfır boyutlu olabilir. Yani görünmez kenarları olan ve kenar boşlukları olmayan paneller düz formla aynıdır. Tablo vb. Gruplandırmanız gerekiyorsa sadece sağ paneli kullanın - TableLayoutPanel
Alex Zhukovskiy

38

Radyo düğmelerinizi bir GroupBox'a yerleştirmeye bakın .


1
GroupBox, radyo düğmeleriyle tamamen ilgisizdir. Herhangi bir konteyner yapacak.
usr

30

Grubun tüm radyo düğmelerini bir GroupBox veya Panel gibi aynı kaba yerleştirmelisiniz.


1
Bunun gibi bir şey yapmaya çalıştığınız gibi iç içe panel katmanlarınız olduğunda karmaşıklaşır . Radyo düğmeleri ebeveynleriyle çakışıyor.
Agi Hammerthief

24

WPF'de RadioButtons'u gruplama kavramını seviyorum. GroupNameHangi RadioButton kontrollerinin birbirini dışladığını belirten bir özellik vardır ( http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx ).

Bu yüzden bu özelliği destekleyen WinForms için türetilmiş bir sınıf yazdım:

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
Bu bir TableLayoutPanel içindeki bir grupta RadioButtons gerekli bir durumda benim için kullanışlı geldi - teşekkür ederim!
pelazem

Bu sınıfı kendi formlarımdan biri için kullanmaya çalışıyorum, ancak bir grup kutusunun üstünde görüntülemek için denetim alma konusunda sorun yaşıyorum (grup kutusunun başlığı gibi). Üst düzey radyo düğmesi olarak işlev görmesi amaçlanmıştır ( id est , bu radyo düğmesinin grubu formun kökündeki bir paneldir ve grup kutusu bir kardeştir). Bunu başarmak için bu sınıfın nasıl kullanılacağına dair herhangi bir örnek kod var mı?
Agi Hammerthief

Ben yazardım IEnumerable<Control> arbControls = null;yerine dinamiğini kullanarak. varMaskeler daha da, ben normalde benim kodunda sadece açık türlerini kullanmak niçin yıllardan bu. Aksi takdirde, çok iyi bir iş ve bunu paylaştığınız için çok teşekkürler! +1
sɐunıɔ ןɐ qɐp

11

Panelsiz radyo düğmesi

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

7

Radyo düğmelerini GroupBox'a (veya başka bir panele) yerleştirin

resim açıklamasını buraya girin


5

GroupBoxAma sadece grup kutusu değil, Panels( System.Windows.Forms.Panel) bile kullanabilirsiniz .

  • Internet Protokolü sürüm 4 ayar iletişim kutusunu tasarlarken çok kullanışlıdır. (Bilgisayarınızla (windows) kontrol edin, sonra davranışı anlayabilirsiniz)

5

Bir paylaşım konteynerinin içindeki tüm radyo düğmeleri varsayılan olarak aynı gruptadır . Bunlardan birini kontrol ederseniz anlamına gelir - diğerleri işaretlenmez. Bağımsız radyo düğmesi grupları oluşturmak istiyorsanız, bunları farklı kodlara yerleştirmenizGroup Box veya İşaretli durumlarını arkadaki kod aracılığıyla kontrol etmeniz gerekir .


4

Bunları bir kaba koyamazsanız , her RadioButton'un işaretli durumunu değiştirmek için kod yazmanız gerekir :

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

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

Bu sizi sonsuz bir döngüye sokacaktır ,,,
Michael Sandler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.