আমি কীভাবে উইন্ডোজ ফর্ম রেডিও বোতামগুলি গ্রুপ করব?


315

আমি কীভাবে উইন্ডোজ ফর্ম অ্যাপ্লিকেশনে রেডিও বোতামগুলি গ্রুপ করতে পারি (অনেকটা এএসপি.নেট এর রেডিওবোটনলিস্টের মতো!)?

সুতরাং আমি অপশন থেকে বেছে নেওয়া প্রতিটি ক্ষেত্রে মধ্যে পরিবর্তন করতে পারেন।



স্ক্রিনশটটি দেখুন: স্ট্যাকওভারফ্লো.com
লুইস পেরেজ

উত্তর:


425

গোষ্ঠীর জন্য সমস্ত রেডিও বোতাম একটি Panelবা একটির মতো ধারক বস্তুতে রাখুন GroupBox। এটি স্বয়ংক্রিয়ভাবে তাদের উইন্ডোজ ফর্মগুলিতে একসাথে গোষ্ঠীভূত করবে।


13
@ মোমাহমসাদেঘসাহাটি প্রশ্নটি উইন্ডোজ ফর্ম রেডিওবাটন সম্পর্কে ছিল, এটি কোনও গ্রুপনেম সম্পত্তি প্রকাশ করে না।
UweB

2
@ ইউইউবি যদি আমি কোনও সমস্যার কারণে গ্রুপ বাক্স এবং প্যানেল যুক্ত করতে না পারি তবে বলতে পারি যে আমার ফর্মে আমার বেশি জায়গা নেই। তারপর?
মুহাম্মদ সাকিব 10

2
@ মুহাম্মাদসাকিব এটি অসম্ভব কারণ প্যানেলগুলি শূন্য আকারের হতে পারে। আমি বলতে চাইছি অদৃশ্য সীমানা এবং মার্জিন ছাড়াই প্যানেলগুলি সরল ফর্মের মতো। কেবল ডান প্যানেলটি ব্যবহার করুন - টেবিল লেআউটপ্যানেলটি যদি আপনি টেবিল ইত্যাদিতে গ্রুপ করেন তবে
অ্যালেক্স

38

একটি গ্রুপবক্সে আপনার রেডিও বোতাম স্থাপনের দিকে তাকান ।


1
গ্রুপবক্স সম্পূর্ণ রেডিও বোতামগুলির সাথে সম্পর্কিত নয়। যে কোনও ধারক তা করবে।
usr

30

আপনার গ্রুপের সমস্ত রেডিও বোতামগুলি একই পাত্রে যেমন একটি গ্রুপবক্স বা প্যানেলের মধ্যে রাখা উচিত।


1
আপনি নেস্টেড প্যানেলগুলির স্তর পেলে এটি জটিল হয়ে যায়, যেমন আপনি যখন এমন কিছু করার চেষ্টা করছেন তখন । রেডিও বোতামগুলি তাদের পিতামাতার সাথে বিরোধ করে।
আগি হ্যামার্থিফ

24

আমি ডাব্লুপিএফ-এ রেডিওবটনগুলি গ্রুপিংয়ের ধারণাটি পছন্দ করি। একটা সম্পত্তি 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);
        }
    }
}

3
এটি আমার জন্য এমন এক পরিস্থিতিতে কার্যকর হয়েছিল যেখানে আমার একটি টেবিললআউটপ্যানেলের অভ্যন্তরে একটি গ্রুপে রেডিওবটনগুলি দরকার ছিল - আপনাকে ধন্যবাদ!
পেলেজেম

আমি এই শ্রেণিটি আমার নিজস্ব ফর্মগুলির জন্য ব্যবহার করার চেষ্টা করছি, তবে একটি গ্রুপ বাক্সের শীর্ষে প্রদর্শন করার নিয়ন্ত্রণ পেতে সমস্যা হচ্ছে (যেন এটি গ্রুপ বাক্সের শিরোনাম)। এটি শীর্ষ স্তরের রেডিও বোতাম হিসাবে পরিবেশন বোঝানো হয়েছে ( আইডি ইস্ট , এই রেডিও বোতামটির জন্য গ্রুপটি ফর্মের মূলের একটি প্যানেল এবং গ্রুপ বাক্সটি ভাইবোন) এই শ্রেণিটি কীভাবে অর্জন করতে হয় সে সম্পর্কে কী কোনও উদাহরণ কোড রয়েছে?
আগি হামার্থিফ

আমি IEnumerable<Control> arbControls = null;ডায়নামিক ব্যবহার না করে লিখতাম। varমুখোশ এটি আরও বেশি, এবং সে জন্যই আমি সাধারণত আমার কোড একমাত্র স্পষ্ট ধরনের ব্যবহার করি। অন্যথায়, খুব ভাল কাজ, এবং এই ভাগ করে নেওয়ার জন্য অনেক ধন্যবাদ! +1
সুনুন ןɐ কিউপি

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আরও ভাল B তবে কেবল গ্রুপ বাক্সই নয়, আপনি 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;
}

এটি আপনাকে একটি অসীম লুপে ফেলবে ,,,
মাইকেল স্যান্ডলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.