找到与谓词匹配的所有ASP.NET控件?

时间:2009-08-05 15:33:30

标签: c# .net asp.net

我需要枚举一组控件 - 无论它们的嵌套级别如何 - 与给定的谓词匹配。

最初出现问题,当我需要将网格行中的所有文本框设置为ReadOnly时,如果该行中的列指示该记录不应该是可编辑的。

后来我意识到,我已经解决过去非常像这个问题,只有不同的标准(通过其ID递归找到一个控件)。

在尝试了一些替代方案之后,我想出了一个有效的通用解决方案。但由于我经常使用这种方法,我想收集可能的改进。

此方法将返回与谓词匹配的所有子控件:

public static IEnumerable<T> FindChildControls<T>(this Control parentControl,
    Predicate<Control> predicate) where T : Control
    {
        foreach (Control item in parentControl.Controls) {
            if (predicate(item))
                yield return (T)item;

            foreach (T child in item.FindChildControls<T>(predicate)) {
                yield return child;
            }
        }
    }

public static IEnumerable<T> FindChildControls<T>(this Control parentControl, Predicate<Control> predicate) where T : Control { foreach (Control item in parentControl.Controls) { if (predicate(item)) yield return (T)item; foreach (T child in item.FindChildControls<T>(predicate)) { yield return child; } } }

使用此方法,我可以执行以下操作:

1 个答案:

答案 0 :(得分:5)

如果需要,可以使用队列来摆脱递归。

        public static IEnumerable<T> FindChildControls<T>(Control parentControl,
        Predicate<Control> predicate) where T : Control
        {
            Queue<Control> q = new Queue<Control>();

            foreach (Control item in parentControl.Controls)
            {
                q.Enqueue(item);
            }

            while (q.Count > 0)
            {
                Control item = q.Dequeue();
                if (predicate(item))
                    yield return (T)item;

                foreach (Control child in item.Controls)
                {
                    q.Enqueue(child);
                }
            }

        }