سی شارپ و رادیو باتن ها

mamad.noise

کاربر فعال انجمن فتوشاپ
با سلام خدمت اساتید
میرم سر اصل مطلب ، من میخوام یه نرم افزار درست کنم که:
اولش بگم تحت C#
میخوام این نرم افزار در یک فرم باشه در همین فرم که فرم اصیه یه چند تاسوال از کاربر بپرسه که با گروپ باکس از هم جدا بشن
هر کدوم از سوالات با استفاده از4 رادیو باتن پاسخ داده میشن
حالا میخوام اخر سر ببینم چند تا رادیو باتن در هر 4ردیف انتخاب شده اند (با زدن دکمه محاسبه)
خودم ایده ی خوبی به ذهنم نرسید برای اینکار(البته این فکر به ذهنم زده که توی هر رادیو باتن یه متغیر رو مقدار 1بدم از آخر جمع بگیرم) اما زیاد جالب نیس بنظرم چون سوالات زیاده
پیشاپیش ممنون:rose:
 

the_king

مدیرکل انجمن
با سلام خدمت اساتید
میرم سر اصل مطلب ، من میخوام یه نرم افزار درست کنم که:
اولش بگم تحت C#
میخوام این نرم افزار در یک فرم باشه در همین فرم که فرم اصیه یه چند تاسوال از کاربر بپرسه که با گروپ باکس از هم جدا بشن
هر کدوم از سوالات با استفاده از4 رادیو باتن پاسخ داده میشن
حالا میخوام اخر سر ببینم چند تا رادیو باتن در هر 4ردیف انتخاب شده اند (با زدن دکمه محاسبه)
خودم ایده ی خوبی به ذهنم نرسید برای اینکار(البته این فکر به ذهنم زده که توی هر رادیو باتن یه متغیر رو مقدار 1بدم از آخر جمع بگیرم) اما زیاد جالب نیس بنظرم چون سوالات زیاده
پیشاپیش ممنون:rose:

ابتدا یک متد ایجاد می کنیم که روی فرم سوال جدید ایجاد کند :
کد:
        private void CreateQuestion(string question, params string[] answers)
        {
            int bottom = 10;
            foreach (Control ctl in this.Controls)
            {
                if (ctl is GroupBox)
                {
                    bottom = Math.Max(bottom, ctl.Bottom + 10);
                }
            }
            GroupBox group = new GroupBox();
            group.Text = question;
            group.Bounds = new Rectangle(10, bottom, 400, 40);
            this.Controls.Add(group);
            for (int i = 0; i < answers.Length; i++)
            {
                RadioButton radio = new RadioButton();
                radio.Text = answers[i];
                radio.Bounds = new Rectangle(10 + i * ((group.Width - 10) / answers.Length), 15, 1, 1);
                radio.AutoSize = true;
                group.Controls.Add(radio);
            }
        }

مثلا :
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            CreateQuestion("What is the opposite of white?", "red", "black", "blue", "none");
            CreateQuestion("What is the sum of 2 + 2?", "22", "2", "4", "5");
            CreateQuestion("Which one is bigger, the earth, the sun or the moon?", "sun", "earth", "moon", "none");
        }

سپس یک متد ایجاد می کنیم که بر اساس موقعیت افقی RadioButton های داخل یک GroupBox تیک خورده ها را جمع بزند :
کد:
        private class AnswerComparer : IComparer<Control>
        {
            public int Compare(Control x, Control y)
            {
                return x.Left - y.Left;
            }
        }

        private void SumAnswers(out int answer1, out int answer2, out int answer3, out int answer4)
        {
            int[] answers = new int[4];
            foreach (Control ctl in this.Controls)
            {
                if (ctl is GroupBox)
                {
                    List<Control> controls = new List<Control>();
                    foreach (Control child in ctl.Controls)
                    {
                        if (child is RadioButton)
                        {
                            controls.Add(child);
                        }
                    }
                    controls.Sort(new AnswerComparer());
                    for (int i = 0; (i < controls.Count) && (i < 4); i++)
                    {
                        if (((RadioButton)controls[i]).Checked)
                        {
                            answers[i]++;
                        }
                    }
                }
            }
            answer1 = answers[0];
            answer2 = answers[1];
            answer3 = answers[2];
            answer4 = answers[3];
        }

مثلا :
کد:
        private void button1_Click(object sender, EventArgs e)
        {
            int answer1, answer2, answer3, answer4;
            SumAnswers(out answer1, out answer2, out answer3, out answer4);
            MessageBox.Show(string.Format("{0}  {1}  {2}  {3}", answer1, answer2, answer3, answer4));
        }

تاپیک منتقل گردید.
 

mamad.noise

کاربر فعال انجمن فتوشاپ
با سلام
یکم توضیح میدی رو کد ها؟
من تازه چند ماهه c# رو شروع کردم
 

the_king

مدیرکل انجمن
با سلام
یکم توضیح میدی رو کد ها؟
من تازه چند ماهه c# رو شروع کردم

this.Controls مجموعه کنترل های فرزند روی فرم ئه، اما فقط فرزند ها، نوه و نتیجه ها که خودشان داخل یک کنترل دیگه مثل GroupBox هستند رو شامل نمیشه.
حلقه زیر همه کنترل های فرزند فرم رو بررسی می کنه تا موقعیت پایین ترین GroupBox روی فرم مشخص بشه، یعنی موقعیتی که GroupBox جدید رو اونجا قرار می دهیم :
کد:
            int bottom = 10;
            foreach (Control ctl in this.Controls)
            {
                if (ctl is GroupBox)
                {
                    bottom = Math.Max(bottom, ctl.Bottom + 10);
                }
            }

یک GroupBox جدید می سازیم.
مقدار Text اش رو مشخص می کنیم.
ابعاد و موقعیت اش رو روی فرم تنظیم می کنیم.
و در نهایت روی فرم قرار اش می دهیم (به مجموعه کنترل های فرزند فرم اضافه اش می کنیم)
کد:
            GroupBox group = new GroupBox();
            group.Text = question;
            group.Bounds = new Rectangle(10, bottom, 400, 40);
            this.Controls.Add(group);

داخل یک حلقه به تعداد پاسخ ها RadioButton جدید ایجاد می کنیم.
Text شون رو مشخص می کنیم.
موقعیت و ابعاد شون رو روی GroupBox تنظیم می کنیم.
ابعاد شان را AutoSize می کنیم تا بر اساس متن داخل شان تغییر کنه.
و در نهایت به مجموعه کنترل های فرزند GroupBox جدید مان اضافه می کنیم.
کد:
            for (int i = 0; i < answers.Length; i++)
            {
                RadioButton radio = new RadioButton();
                radio.Text = answers[i];
                radio.Bounds = new Rectangle(10 + i * ((group.Width - 10) / answers.Length), 15, 1, 1);
                radio.AutoSize = true;
                group.Controls.Add(radio);
            }

وقتی کلاسی می سازید که از IComparer ارث بری می کنه می تونه دو عنصر رو با هم مقایسه کنه و بگه کدوم یکی بزرگتره.
ما این کلاس AnswerComparer رو برای این می سازیم که بین دو کنترل بتونه بگه کدوم یکی سمت راسته و کدوم یکی سمت چپ.
با استفاده از این کلاس می توانیم RadioButton ها رو از سمت چپ به راست مرتب کنیم و بفهمیم که کدوم یکی اول لیسته و کدومی یکی دومه و ...
کد:
        private class AnswerComparer : IComparer<Control>
        {
            public int Compare(Control x, Control y)
            {
                return x.Left - y.Left;
            }
        }

داخل حلقع در بین کنترل های فرزند فرم اونهایی که GroupBox اند رو بررسی می کنیم. برای هر کدوم جداگانه یک لیست می سازم و بین فرزند هاشون RadioButton ها رو
به اون لیست اضافه می کنیم :
کد:
            foreach (Control ctl in this.Controls)
            {
                if (ctl is GroupBox)
                {
                    List<Control> controls = new List<Control>();
                    foreach (Control child in ctl.Controls)
                    {
                        if (child is RadioButton)
                        {
                            controls.Add(child);
                        }
                    }
این لیست الزاما بر اساس ویژگی خاصی مرتب نیست، ما اون رو بر اساس موقعیت RadioButton ها از چپ به راست مرتب می کنیم، به کمک کلاس
AnswerComparer که قبلا ساخته ایم :
کد:
                    controls.Sort(new AnswerComparer());

داخل حلقه چک می کنیم که اگر بین چهار عنصر اول این لیست موردی Checked بود و انتخاب شده بود مقدار شمارنده اش را یک واحد زیاد کنیم :
کد:
                    for (int i = 0; (i < controls.Count) && (i < 4); i++)
                    {
                        if (((RadioButton)controls[i]).Checked)
                        {
                            answers[i]++;
                        }
                    }
 

جدیدترین ارسال ها

بالا