递归地获取所有复选框的ID

时间:2011-05-08 15:39:47

标签: c# asp.net recursion traversal

我有一个名为pnlCategories的ASP.NET面板。我要做的是创建一个函数,返回在此面板中检查的所有复选框的列表通用列表。还有其他子控件(包括其他面板和表),此函数必须遍历以查找所有复选框。任何人有任何想法如何做到这一点?顺便说一下,这是C#。

2 个答案:

答案 0 :(得分:2)

简单,也未经测试。这可以适用于仅收集控件ID,但这是一个可重用的,并且在公共库中是一个很好的。

    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 :(得分:0)

我会说这样的事情(改编)可能会奏效。我没有测试过这个,但它应该让你在某个地方接近。

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();
}