मैं विंडोज फॉर्म एप्लिकेशन (ASP.NET के रेडियोबूटटोनलिस्ट की तरह बहुत कुछ) में रेडियो बटन कैसे समूहित कर सकता हूं!
इसलिए मैं विकल्पों में से चुने गए प्रत्येक मामले के बीच स्विच कर सकता हूं।
मैं विंडोज फॉर्म एप्लिकेशन (ASP.NET के रेडियोबूटटोनलिस्ट की तरह बहुत कुछ) में रेडियो बटन कैसे समूहित कर सकता हूं!
इसलिए मैं विकल्पों में से चुने गए प्रत्येक मामले के बीच स्विच कर सकता हूं।
जवाबों:
एक कंटेनर ऑब्जेक्ट में समूह के लिए सभी रेडियो बटन लगाएं जैसे a Panel
या a GroupBox
। यह स्वचालित रूप से उन्हें विंडोज फॉर्म में एक साथ समूहीकृत करेगा।
अपने रेडियो बटन को ग्रुपबॉक्स में रखकर देखें ।
आपको समूह के सभी रेडियो बटन को एक ही कंटेनर जैसे GroupBox या पैनल के अंदर रखना चाहिए।
मुझे 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);
}
}
}
IEnumerable<Control> arbControls = null;
गतिशील का उपयोग करने के बजाय लिखूंगा । var
मास्क यह और भी है, और यही कारण है कि मैं सामान्य रूप से मेरी कोड में केवल स्पष्ट प्रकार का उपयोग की। अन्यथा, बहुत अच्छी नौकरी, और इसे साझा करने के लिए बहुत बहुत धन्यवाद! +1
पैनल के बिना रेडियो बटन
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);
}
एक शेयर कंटेनर के अंदर सभी रेडियो बटन एक ही समूह में हैं डिफ़ॉल्ट रूप में हैं । मतलब, अगर आप उनमें से एक की जाँच करते हैं - तो दूसरे अनियंत्रित होंगे। यदि आप रेडियो बटनों के स्वतंत्र समूह बनाना चाहते हैं, तो आपको उन्हें अलग-अलग कंटेनरों में वर्गीकृत करना चाहिए Group Box
, या पीछे कोड के माध्यम से उनकी जाँच की स्थिति को नियंत्रित करना चाहिए ।
यदि आप उन्हें एक कंटेनर में नहीं डाल सकते हैं, तो आपको प्रत्येक रेडियोबटन की जाँच की गई स्थिति को बदलने के लिए कोड लिखना होगा :
private void rbDataSourceFile_CheckedChanged(object sender, EventArgs e)
{
rbDataSourceNet.Checked = !rbDataSourceFile.Checked;
}
private void rbDataSourceNet_CheckedChanged(object sender, EventArgs e)
{
rbDataSourceFile.Checked = !rbDataSourceNet.Checked;
}