Проверьте, установлены ли все флажки формы - PullRequest
0 голосов
/ 04 января 2019

У меня есть несколько флажков, которые я создал динамически из кода, так что я знаю, что могу получить флажки, используя:

foreach (var checkBox in this.Controls.OfType<CheckBox>())
            {

            }

Но я хочу знать, или мой результат желает знать, все ли флажки моегоформы проверяются как что-то вроде bool, возвращающего true, если установлены все флажки, или false, если один отсутствует ... Как мне этого добиться?С уважением

bool allChecked = ... 

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Если вы уверены, что флажки доступны, вы можете использовать

 var allChecked = this.Controls.OfType<CheckBox>().All(x => x.Checked);

, но если есть вероятность, что Enumerable не даст результата, вам нужно использовать код ниже.потому что оператор All возвращает true для пустых Enumerable

    bool allChecked = false;
    var checkBoxes = this.Controls.OfType<CheckBox>();
    if (checkBoxes.Any())
        allChecked = checkboxes.All(x => x.Checked);
0 голосов
/ 04 января 2019

Если вы хотите убедиться, что отмечены все флажки в форме, даже те, которые принадлежат другим элементам управления контейнера, вам придется перебирать коллекцию Controls каждого элемента управления (а не только те, которые принадлежат Form).

Один из способов сделать это - написать рекурсивный метод, который принимает элемент управления контейнера (например, Form) и проверяет все элементы управления в его коллекции.Если какой-либо элемент управления является Checkbox и не проверен, верните false.В противном случае выполните рекурсивную проверку коллекции Controls этого элемента управления.Если ни одна из этих проверок не является ложной, верните true.

Например:

private static bool ContainedCheckboxesAreChecked(Control containerControl)
{        
    // For each control in the container
    foreach (Control control in containerControl.Controls)
    {
        // Return false if the control is a checkbox and it's not checked
        if (!(control as CheckBox)?.Checked ?? false) return false;

        // Do a recursive check on this control's Controls collection
        if (!ContainedCheckboxesAreChecked(control)) return false;
    }

    // If we got this far, return true
    return true;
}

Теперь, если вы вызовете это и передадите главную форму в качестве элемента управления контейнера, вы изучитевсе элементы управления в форме, включая все контейнеры (даже вложенные):

bool allCheckBoxesAreChecked = ContainedCheckboxesAreChecked(this);
0 голосов
/ 04 января 2019

Просто как

bool allChecked = this.Controls.OfType<CheckBox>().All(c => c.Checked);

Я не уверен, что такое AllControls (в оригинальном неотредактированном посте).Потому что это свойство не является стандартным.В этом примере используется стандартная коллекция Controls, присутствующая в любом контейнере элемента управления, например форма

верхнего уровня. Проблема более сложна, если ваши CheckBoxes распределены внутри различных контейнеров элемента управления.В этом случае вы можете использовать рекурсивную функцию, которая итеративно исследует ваши элементы управления и подсчитывает, сколько из них проверено

int result = RecursiveCheck(f.Controls);
if(result > 0)
    Console.WriteLine("Something is not checked");

int RecursiveCheck(Control.ControlCollection col)
{
    int count = 0;
    foreach(Control c in col)
    {
        if (c.Controls.Count > 0)
        {
            count += c.Controls.OfType<CheckBox>().Count(x => !x.Checked);
            count += RecursiveCheck(c.Controls);
        }   
    }
    return count;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...