Рекурсивное получение идентификаторов всех установленных флажков

#c# #asp.net #recursion #traversal

#c# #asp.net #рекурсия #обход

Вопрос:

У меня есть ASP.NET панель под названием pnlCategories. Что я пытаюсь сделать, так это создать функцию, которая возвращает общий список всех флажков, которые установлены внутри этой панели. Существуют другие дочерние элементы управления (включая другие панели и таблицы), через которые этой функции придется пройти, чтобы найти все флажки. У кого-нибудь есть идеи, как это сделать? Кстати, это C #.

Комментарии:

1. Вы могли бы использовать javascript для построения строки идентификаторов, а затем проанализировать строку в C # для создания списка.

Ответ №1:

Простой, также непроверенный. Это можно было бы адаптировать только для сбора идентификаторов элементов управления, но это немного более многократно используемое средство, и его удобно иметь в общей библиотеке.

     public static void FindControlsRecursive(Control root, Type type, ref List<Control> list)
    {
        if(root.Controls.Count != 0)
        {
            foreach(Control c in root.Controls)
            {
                if(c.GetType() == type)
                    list.Add(c);
                else if (c.HasControls())
                    FindControlsRecursive(c, type, ref list);
            }
        }
    }
  

И использование:

 var checkboxes = new List<Control>();
FindControlRecursive(pnlCategories, typeof(CheckBox), ref checkboxes);

var ids = checkboxes.Select(c => c.UniqueID).ToList(); // or however you'd like to get them.
  

Комментарии:

1. Попробовал это, но по какой-то причине он вообще не нашел никаких элементов управления. Пытаюсь выяснить, почему сейчас.

2. На каком этапе жизненного цикла страницы вы ищете элементы управления? Вы ищете их после обратной отправки или при первой загрузке страницы?

3. Хорошо, у меня это работает. Причина, по которой это не работало раньше, была по моей собственной вине. Этот код работает хорошо, спасибо!

Ответ №2:

Я бы сказал, что что-то вроде этого (адаптированное) может сработать. Я не тестировал это, но это должно привести вас к чему-то близкому.

 public List<CheckBox> FindAllCheckBoxControls(WebControl webControl)
{
     if(webControl.Controls.Count == 0)
         return new List<CheckBox>();

     var checkBoxes = webControl.Controls
          .Where(x => x.GetType() == typeof(CheckBox));
          .Select(x => x as CheckBox)
          .ToList();

     webControl.Controls.ToList().ForEach(control =>
        {
             checkBoxes.AddRange(FindAllCheckBoxControls(control));
        });

     return checkBoxes.Distinct();
}
  

Комментарии:

1. Пробовал это, но выдает кучу ошибок. Код Linq кажется неправильным.