Очистить объяснение фрагмента кода текстовых полей Winform - PullRequest
0 голосов
/ 04 июня 2018

плохо знакомы с c #

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

Как очистить текст всех текстовых полей в форме?

выполняет работу, но кто-то может объяснить мне, что она делает?

private void ClearTextBoxes()
{
    Action<Control.ControlCollection> func = null;

    func = (controls) =>
    {
        foreach (Control control in controls)
            if (control is TextBox)
                (control as TextBox).Clear();
            else
                func(control.Controls);
    };

    func(Controls);
}

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

func - это лямбда-функция, которая рекурсивно пересекает ControllCollection.Для каждого элемента, с которым он сталкивается, он проверяет, является ли элемент TextBox.Если это так, TextBox очищается, в противном случае элемент управления является собственной ControlCollection, и функция снова вызывает себя.

Если лямбда-нотация отбрасывает вас, вы также можете посмотреть на это следующим образом:

private void ClearTextBoxes(){
    ClearTextBoxOrContinue(Controls);
}

private void ClearTextBoxOrContinue(Control.ControllCollection controls){
    // iterate over every control in controls (the 'children' of controls)
    foreach (Control thisControl in controls)
        if (thisControl is TextBox)
        // if it is a TextBox, clear it
            (thisControl as TextBox).Clear();
        else
            // else, iterate over thisControl's children (and/or grandchildren...) 
            ClearTextBoxOrContinue(thisControl.Controls);
}
0 голосов
/ 04 июня 2018

Action<Control.ControlCollection> func = null; объявляет делегата, который принимает в качестве аргумента Control.ControlCollection.

func = (controls) => {... } назначает делегату тело анонимного метода, которое при выполнении выполняет действие внутри {...}.

func(Controls); выполняет делегат, передавая коллекцию Controls формы, которая содержитвсе элементы управления верхнего уровня в форме.

Тело метода анонимного метода перечисляет элементы управления в коллекции ControlCollection и очищает все текстовые поля.Для элементов управления, которые не являются TextBox элементами управления, он возвращается в себя и проверяет элементы управления, содержащиеся в элементе управления.Таким образом, если есть GroupBox или какой-либо другой контейнер элемента управления, дочерние элементы этих элементов управления будут искать TextBoxes.

Это можно переписать проще (без делегатов и анонимных методов), выполнив следующие действия:

private void ClearTextBoxes()
{
    ClearTextBoxes(Controls);
}

private void ClearTextBoxes(Control.ControlCollection controls) {
    foreach (Control control in controls)
        if (control is TextBox)
            (control as TextBox).Clear();
        else
            ClearTextBoxes(control.Controls);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...