Итерация по флажкам внутри разных панелей, которые находятся внутри родительской панели - PullRequest
1 голос
/ 21 февраля 2020

Поэтому я создаю кнопку «Отключить все отмеченные флажки» для моего windows приложения в форме c#. Код, который у меня работает, работает нормально, если установить значение l oop через указанную c панель, например:

private void LockChecked_Click(object sender, EventArgs e)
    {
        foreach (Control c in block1Panel.Controls)
        {
            if (c is CheckBox)
            {
                CheckBox cb = (CheckBox)c;
                if (cb.Checked == true)
                {
                    cb.Enabled = false;
                }
            }
        }
    }

Но я хотел бы сделать так, чтобы l oop прошел через весь блок панели (block1Panel, block2Panel, block3Panel и т. д. c.), которые находятся внутри главной панели (Assignments_Panel).

Итак, как мне пройти через все флажки со всех панелей, без необходимости писать все oop для каждой панели? Я знаю, что это возможно, но так как я только начинающий, я не могу понять это, даже после нескольких часов поиска ...

Заранее спасибо! И если что-то в моем вопросе неясно, пожалуйста, скажите так, чтобы я мог объяснить дальше!

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Этот метод может помочь. Он проходит по каждому элементу управления от родительского элемента управления, который в вашем случае выглядит жестко, как если бы он был Assignments_Panel, затем для каждого элемента управления, принадлежащего родительскому элементу управления, он либо снова пропустит l oop через все дочерние элементы управления, либо отключить контроль, если это флажок.

private void DisableCheckboxes(Control parentControl)
{
    foreach (Control childControl in parentControl.Controls)
    {
        if (childControl is Panel childPanel)
        {
            DisableCheckboxes(childPanel);
        }
        else if (childControl is CheckBox childCheckBox)
        {
            childCheckBox.Enabled = false;
        }
    }
}
0 голосов
/ 21 февраля 2020

Ну, мы можем перечислить все элементы управления в форме, проверяя, имеет ли control тип CheckBox; для этого есть много значений, скажем,

Как получить ВСЕ дочерние элементы управления формой Windows указанного типа c (кнопка / текстовое поле)?

давайте напишем старый добрый B read F irst S earch (нет Linq , рекурсия et c.)

 private void LockChecked_Click(object sender, EventArgs e) {
   Queue<Control> agenda = new Queue<Control>(new [] { this });

   while (agenda.Count > 0) {
     Control control = agenda.Dequeue();

     if (control is CheckBox cb && cb.Checked)
       cb.Enabled = false;

     foreach (Control child in control.Controls)
       agenda.Enqueue(child);
   }
 }
...