Formamdagi barcha tasdiqlash qutilarini qanday aylantiraman?

Maktabga dasturda ishlayapman, unda siz ma'lumotni ekranda ko'rsatiladigan ro'yxatga qo'shishingiz mumkin.

Shakliga 8 tasdiqlash qutisi va har biri konsolni ifodalaydi. O'yin mavjud bo'lgan konsollarni tekshirishingiz mumkin.

Natijada, har bir konsol uchun 8 xil qiymatdan iborat booleanlar majmuasini olishni istayman.

Mening kodim ixcham emas va juda yaxshi echim bo'lishi kerakligiga ishonaman. Har bir tasdiq qutisi uchun kod yozish o'rniga kodni ko'chirib olishim mumkinmi?

Hozirda menda nima bor.

private void button1_Click(object sender, EventArgs e) 
{
    bool[] platforms = new bool[8] { false, false, false, false, false, false, false, false };
    if (checkBox1.Checked) 
    {
        platforms[0] = true;
    }
    if (checkBox2.Checked) 
    {
        platforms[1] = true;
    }
    if (checkBox3.Checked) 
    {
        platforms[2] = true;
    }
    if (checkBox4.Checked)
    {
        platforms[3] = true;
    }
    if (checkBox5.Checked)
    {
        platforms[4] = true;
    }
    if (checkBox6.Checked)
    {
        platforms[5] = true;
    }
    if (checkBox7.Checked)
    {
        platforms[6] = true;
    }
    if (checkBox8.Checked)
    {
        platforms[7] = true;
    }
}
3
Formangizda Controls to'plami mavjud. Uni CheckBox orqali filtrlash ustida ishoning. CheckBox har bir Tag xususiyatini uning semantikasiga bog'lang.
qo'shib qo'ydi muallif Tigran, manba
Formangizda Controls to'plami mavjud. Uni CheckBox orqali filtrlash ustida ishoning. CheckBox har bir Tag xususiyatini uning semantikasiga bog'lang.
qo'shib qo'ydi muallif Tigran, manba
Shaklingizda ro'yxatdan o'tgan har qanday tekshirish uchun havola mavjud bo'lgan arizangizda Controls xususiyatiga ega bo'lishi kerak. Ularni ko'chirib o'tkazing va turini tekshiring ( bekor qilavermasin checkbox controls ). Keyinchalik ismni olishingiz va ismga asoslangan holda so'nggi belgilarning raqamli qiymatini olishingiz va ularni indeksni tekshirishlar qiymatiga (yuqoridagi mantiq asosida) o'rnatish uchun ishlatishingiz mumkin.
qo'shib qo'ydi muallif Igor, manba
Shaklingizda ro'yxatdan o'tgan har qanday tekshirish uchun havola mavjud bo'lgan arizangizda Controls xususiyatiga ega bo'lishi kerak. Ularni ko'chirib o'tkazing va turini tekshiring ( bekor qilavermasin checkbox controls ). Keyinchalik ismni olishingiz va ismga asoslangan holda so'nggi belgilarning raqamli qiymatini olishingiz va ularni indeksni tekshirishlar qiymatiga (yuqoridagi mantiq asosida) o'rnatish uchun ishlatishingiz mumkin.
qo'shib qo'ydi muallif Igor, manba
Buning uchun siz oddiygina Google qidiruvini amalga oshirishni boshlashingiz mumkin ... Bu erda turli xil ishlaydigan misollarning 100tasi mavjud foreach (bu.Controls.OfType () da mavjud cb) {// do stuff tekshirilganligini tekshiring, so'ng platformalar o'rnatiladi [] ...}
qo'shib qo'ydi muallif MethodMan, manba
Buning uchun siz oddiygina Google qidiruvini amalga oshirishni boshlashingiz mumkin ... Bu erda turli xil ishlaydigan misollarning 100tasi mavjud foreach (bu.Controls.OfType () da mavjud cb) {// do stuff tekshirilganligini tekshiring, so'ng platformalar o'rnatiladi [] ...}
qo'shib qo'ydi muallif MethodMan, manba
Buning uchun siz oddiygina Google qidiruvini amalga oshirishni boshlashingiz mumkin ... Bu erda turli xil ishlaydigan misollarning 100tasi mavjud foreach (bu.Controls.OfType () da mavjud cb) {// do stuff tekshirilganligini tekshiring, so'ng platformalar o'rnatiladi [] ...}
qo'shib qo'ydi muallif MethodMan, manba
Lambda ifodalarini bilasizmi .. Men shunga o'xshash biror narsaga qarashim mumkin ... yoki Controls sinfidan foydalanib boshqarish vositalaridan qanday qilib pastadir? ..
qo'shib qo'ydi muallif MethodMan, manba

11 javoblar

Buni Windows Forms deb bilsangiz, siz shunday qilishingiz mumkin:

int index = 0;
foreach (Control Con in this.Controls)
{
    if (Con is CheckBox)
        platforms[index++] = ((CheckBox)Con).Checked;
}
5
qo'shib qo'ydi
Bundan tashqari, barcha tekshiruvlar orqali pastadir o'tkazish va o'zingizning turini tekshirish o'rniga Controls.OfType () dan foydalanishni tavsiya etaman. Katta emas, lekin u yanada ixcham.
qo'shib qo'ydi muallif adv12, manba
Shunisi e'tiborga loyiqki, agar bu tasdiqlash xujjatlari shaklning bevosita bolalari bo'lsa, bu faqatgina ishlaydi. Paneli, guruh qutilarini yoki boshqa konteynerlarni nazorat qilishni to'xtatmaydi.
qo'shib qo'ydi muallif adv12, manba
Rahmat @ adv12 va Igor, juda ko'p ma'lumotlarga ega emas edilar, u erda tekshiruvchilar qanday joylashtirilgan, ammo ikkovingiz ham mutlaqo to'g'ri! Salomlar!
qo'shib qo'ydi muallif karkazz, manba
Katta yechim. Rahmat!
qo'shib qo'ydi muallif user6362456, manba

Buni Windows Forms deb bilsangiz, siz shunday qilishingiz mumkin:

int index = 0;
foreach (Control Con in this.Controls)
{
    if (Con is CheckBox)
        platforms[index++] = ((CheckBox)Con).Checked;
}
5
qo'shib qo'ydi
Bundan tashqari, barcha tekshiruvlar orqali pastadir o'tkazish va o'zingizning turini tekshirish o'rniga Controls.OfType () dan foydalanishni tavsiya etaman. Katta emas, lekin u yanada ixcham.
qo'shib qo'ydi muallif adv12, manba
Shunisi e'tiborga loyiqki, agar bu tasdiqlash xujjatlari shaklning bevosita bolalari bo'lsa, bu faqatgina ishlaydi. Paneli, guruh qutilarini yoki boshqa konteynerlarni nazorat qilishni to'xtatmaydi.
qo'shib qo'ydi muallif adv12, manba
Rahmat @ adv12 va Igor, juda ko'p ma'lumotlarga ega emas edilar, u erda tekshiruvchilar qanday joylashtirilgan, ammo ikkovingiz ham mutlaqo to'g'ri! Salomlar!
qo'shib qo'ydi muallif karkazz, manba
Katta yechim. Rahmat!
qo'shib qo'ydi muallif user6362456, manba

Buni Windows Forms deb bilsangiz, siz shunday qilishingiz mumkin:

int index = 0;
foreach (Control Con in this.Controls)
{
    if (Con is CheckBox)
        platforms[index++] = ((CheckBox)Con).Checked;
}
5
qo'shib qo'ydi
Bundan tashqari, barcha tekshiruvlar orqali pastadir o'tkazish va o'zingizning turini tekshirish o'rniga Controls.OfType () dan foydalanishni tavsiya etaman. Katta emas, lekin u yanada ixcham.
qo'shib qo'ydi muallif adv12, manba
Shunisi e'tiborga loyiqki, agar bu tasdiqlash xujjatlari shaklning bevosita bolalari bo'lsa, bu faqatgina ishlaydi. Paneli, guruh qutilarini yoki boshqa konteynerlarni nazorat qilishni to'xtatmaydi.
qo'shib qo'ydi muallif adv12, manba
Rahmat @ adv12 va Igor, juda ko'p ma'lumotlarga ega emas edilar, u erda tekshiruvchilar qanday joylashtirilgan, ammo ikkovingiz ham mutlaqo to'g'ri! Salomlar!
qo'shib qo'ydi muallif karkazz, manba
Katta yechim. Rahmat!
qo'shib qo'ydi muallif user6362456, manba

Siz this.Controls.OfType dan foydalanishingiz mumkin, lekin natijasini bool qatoriga saqlashingiz kerak, shuning uchun ushbu kod siz uchun ishlaydi deb o'ylayman:

 bool[] platforms = new bool[8] { false, false, false, false, false, false, false, false };

      var controls = this.Controls.OfType().ToArray();

      for (int i = 0; i < controls.Length; i++)
      {
        platforms[i] = controls[i].Checked;
      }

Agar odatda bunday usuldan foydalansangiz, formasi kabi kengaytmani yaratishingiz mumkin

public static class FormExtension
  {
    public static CheckBox[] GetCheckboxes(this Form form)
    {
      return form.Controls.OfType().ToArray();
    }
  }

Va shunga o'xshash:

var checkboxes = this.GetCheckboxes();
2
qo'shib qo'ydi
Ehtimol, men bir narsa yo'qotishim mumkin, lekin platformalar [0] kodi checkbox1.Checked qiymatiga o'rnatiladi, platformalar [1] ] qiymati checkbox2.Checked va shunga o'xshash qiymatga o'rnatiladi? Boshqaruv elementlari Controls ro'yxatida paydo bo'lish tartibiga tayanmoqdasiz, bu tasdiqlov nomlari uchun zarur bo'lgan korrelyatsiyaga ega emas.
qo'shib qo'ydi muallif adv12, manba
qo'shib qo'ydi muallif Dei Revoledo, manba

Siz this.Controls.OfType dan foydalanishingiz mumkin, lekin natijasini bool qatoriga saqlashingiz kerak, shuning uchun ushbu kod siz uchun ishlaydi deb o'ylayman:

 bool[] platforms = new bool[8] { false, false, false, false, false, false, false, false };

      var controls = this.Controls.OfType().ToArray();

      for (int i = 0; i < controls.Length; i++)
      {
        platforms[i] = controls[i].Checked;
      }

Agar odatda bunday usuldan foydalansangiz, formasi kabi kengaytmani yaratishingiz mumkin

public static class FormExtension
  {
    public static CheckBox[] GetCheckboxes(this Form form)
    {
      return form.Controls.OfType().ToArray();
    }
  }

Va shunga o'xshash:

var checkboxes = this.GetCheckboxes();
2
qo'shib qo'ydi
Ehtimol, men bir narsa yo'qotishim mumkin, lekin platformalar [0] kodi checkbox1.Checked qiymatiga o'rnatiladi, platformalar [1] ] qiymati checkbox2.Checked va shunga o'xshash qiymatga o'rnatiladi? Boshqaruv elementlari Controls ro'yxatida paydo bo'lish tartibiga tayanmoqdasiz, bu tasdiqlov nomlari uchun zarur bo'lgan korrelyatsiyaga ega emas.
qo'shib qo'ydi muallif adv12, manba
qo'shib qo'ydi muallif Dei Revoledo, manba

@ Adv12 idishni nazoratsiz va boshqa konteynerlar ichidagi narsalar haqida aytib o'tganidek, men bir qadam oldinga borish uchun ketyapman, bu juda to'g'ri oldinga va men yaxshi ishlayman.

private void SetCheckedValues()
{
    Action func = null;
    func = (controls) =>
    {
        foreach (Control control in controls)
        {
            if (control is CheckBox)
            {
                (control as CheckBox).Checked();
                //set your other values to True creating a counter variable outside the foreach and 
                //incrementing it inside here
            }
            else
            {
                func(control.Controls);
            }
        }
    };
    func(Controls);
}
0
qo'shib qo'ydi

@ Adv12 idishni nazoratsiz va boshqa konteynerlar ichidagi narsalar haqida aytib o'tganidek, men bir qadam oldinga borish uchun ketyapman, bu juda to'g'ri oldinga va men yaxshi ishlayman.

private void SetCheckedValues()
{
    Action func = null;
    func = (controls) =>
    {
        foreach (Control control in controls)
        {
            if (control is CheckBox)
            {
                (control as CheckBox).Checked();
                //set your other values to True creating a counter variable outside the foreach and 
                //incrementing it inside here
            }
            else
            {
                func(control.Controls);
            }
        }
    };
    func(Controls);
}
0
qo'shib qo'ydi

@ Adv12 idishni nazoratsiz va boshqa konteynerlar ichidagi narsalar haqida aytib o'tganidek, men bir qadam oldinga borish uchun ketyapman, bu juda to'g'ri oldinga va men yaxshi ishlayman.

private void SetCheckedValues()
{
    Action func = null;
    func = (controls) =>
    {
        foreach (Control control in controls)
        {
            if (control is CheckBox)
            {
                (control as CheckBox).Checked();
                //set your other values to True creating a counter variable outside the foreach and 
                //incrementing it inside here
            }
            else
            {
                func(control.Controls);
            }
        }
    };
    func(Controls);
}
0
qo'shib qo'ydi

Buni boshlang'ich deb aytmoqchiman, barcha tasdiqlash qutilaringizni GroupBox yoki Panelda yoki konteynerni boshqarishning bir turini qo'yishingiz kerak. Shunday qilib, qaysi tasdiqlash qutilarini takrorlashni bilasiz. Agar ushbu ro'yxatda siz istamagan yana bir checkbox qo'shsangiz va funksiyangizni to'satdan o'zgartirsangiz, bu ahmoq emasmi?

Men ko'rgan narsani hisobga olsam, bu men tavsiya qiladigan narsa. Yangi boshqaruv elementlarini qo'shganingizda u dinamik ravishda o'sib chiqmaydi, lekin u siz xohlagan katakchalar orqali yinelemeyecektir. Agar tasdiqlash qutilarini konteynerga tashlasangiz, boshqa javobdan foydalaning!

bool[] platforms = new bool[8] 
{
    checkBox1.Checked,
    checkBox2.Checked,
    checkBox3.Checked,
    checkBox4.Checked,
    checkBox4.Checked,
    checkBox5.Checked,
    checkBox6.Checked,
    checkBox7.Checked
};
0
qo'shib qo'ydi

Buni boshlang'ich deb aytmoqchiman, barcha tasdiqlash qutilaringizni GroupBox yoki Panelda yoki konteynerni boshqarishning bir turini qo'yishingiz kerak. Shunday qilib, qaysi tasdiqlash qutilarini takrorlashni bilasiz. Agar ushbu ro'yxatda siz istamagan yana bir checkbox qo'shsangiz va funksiyangizni to'satdan o'zgartirsangiz, bu ahmoq emasmi?

Men ko'rgan narsani hisobga olsam, bu men tavsiya qiladigan narsa. Yangi boshqaruv elementlarini qo'shganingizda u dinamik ravishda o'sib chiqmaydi, lekin u siz xohlagan katakchalar orqali yinelemeyecektir. Agar tasdiqlash qutilarini konteynerga tashlasangiz, boshqa javobdan foydalaning!

bool[] platforms = new bool[8] 
{
    checkBox1.Checked,
    checkBox2.Checked,
    checkBox3.Checked,
    checkBox4.Checked,
    checkBox4.Checked,
    checkBox5.Checked,
    checkBox6.Checked,
    checkBox7.Checked
};
0
qo'shib qo'ydi

Buni boshlang'ich deb aytmoqchiman, barcha tasdiqlash qutilaringizni GroupBox yoki Panelda yoki konteynerni boshqarishning bir turini qo'yishingiz kerak. Shunday qilib, qaysi tasdiqlash qutilarini takrorlashni bilasiz. Agar ushbu ro'yxatda siz istamagan yana bir checkbox qo'shsangiz va funksiyangizni to'satdan o'zgartirsangiz, bu ahmoq emasmi?

Men ko'rgan narsani hisobga olsam, bu men tavsiya qiladigan narsa. Yangi boshqaruv elementlarini qo'shganingizda u dinamik ravishda o'sib chiqmaydi, lekin u siz xohlagan katakchalar orqali yinelemeyecektir. Agar tasdiqlash qutilarini konteynerga tashlasangiz, boshqa javobdan foydalaning!

bool[] platforms = new bool[8] 
{
    checkBox1.Checked,
    checkBox2.Checked,
    checkBox3.Checked,
    checkBox4.Checked,
    checkBox4.Checked,
    checkBox5.Checked,
    checkBox6.Checked,
    checkBox7.Checked
};
0
qo'shib qo'ydi