আমি কীভাবে উইন্ডোজ ফর্ম অ্যাপ্লিকেশনে রেডিও বোতামগুলি গ্রুপ করতে পারি (অনেকটা এএসপি.নেট এর রেডিওবোটনলিস্টের মতো!)?
সুতরাং আমি অপশন থেকে বেছে নেওয়া প্রতিটি ক্ষেত্রে মধ্যে পরিবর্তন করতে পারেন।
আমি কীভাবে উইন্ডোজ ফর্ম অ্যাপ্লিকেশনে রেডিও বোতামগুলি গ্রুপ করতে পারি (অনেকটা এএসপি.নেট এর রেডিওবোটনলিস্টের মতো!)?
সুতরাং আমি অপশন থেকে বেছে নেওয়া প্রতিটি ক্ষেত্রে মধ্যে পরিবর্তন করতে পারেন।
উত্তর:
গোষ্ঠীর জন্য সমস্ত রেডিও বোতাম একটি Panel
বা একটির মতো ধারক বস্তুতে রাখুন GroupBox
। এটি স্বয়ংক্রিয়ভাবে তাদের উইন্ডোজ ফর্মগুলিতে একসাথে গোষ্ঠীভূত করবে।
একটি গ্রুপবক্সে আপনার রেডিও বোতাম স্থাপনের দিকে তাকান ।
আপনার গ্রুপের সমস্ত রেডিও বোতামগুলি একই পাত্রে যেমন একটি গ্রুপবক্স বা প্যানেলের মধ্যে রাখা উচিত।
আমি ডাব্লুপিএফ-এ রেডিওবটনগুলি গ্রুপিংয়ের ধারণাটি পছন্দ করি। একটা সম্পত্তি GroupName
যে নির্দিষ্ট করে যা RadioButton নিয়ন্ত্রণ পারস্পরিক একচেটিয়া (হয় http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx )।
সুতরাং আমি উইনফর্মগুলির জন্য একটি উত্সযুক্ত ক্লাস লিখেছি যা এই বৈশিষ্ট্যটিকে সমর্থন করে:
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;
}