Windows Form uygulamasındaki (ASP.NET'in radyo düğmesi listesi gibi) radyo düğmelerini nasıl gruplandırabilirim?
Bu yüzden seçeneklerden seçilen her vaka arasında geçiş yapabilirim.
Windows Form uygulamasındaki (ASP.NET'in radyo düğmesi listesi gibi) radyo düğmelerini nasıl gruplandırabilirim?
Bu yüzden seçeneklerden seçilen her vaka arasında geçiş yapabilirim.
Yanıtlar:
Bir grup için tüm radyo düğmelerini a Panel
veya a gibi bir kap nesnesine koyun GroupBox
. Bu, onları Windows Forms'da otomatik olarak gruplandıracaktır.
Radyo düğmelerinizi bir GroupBox'a yerleştirmeye bakın .
Grubun tüm radyo düğmelerini bir GroupBox veya Panel gibi aynı kaba yerleştirmelisiniz.
WPF'de RadioButtons'u gruplama kavramını seviyorum. GroupName
Hangi 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);
}
}
}
IEnumerable<Control> arbControls = null;
yerine dinamiğini kullanarak. var
Maskeler 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
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);
}
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 .
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;
}