Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否查找与谓词匹配的所有ASP.NET控件?_C#_.net_Asp.net - Fatal编程技术网

C# 是否查找与谓词匹配的所有ASP.NET控件?

C# 是否查找与谓词匹配的所有ASP.NET控件?,c#,.net,asp.net,C#,.net,Asp.net,我需要枚举与给定谓词匹配的控件集合,而不管它们的嵌套级别如何 最初,当我需要将网格行中的所有文本框设置为ReadOnly,如果该行中的一列指示该记录不应编辑时,问题就出现了 后来我意识到,我在过去已经解决了一个问题,非常像这个问题,只是使用了不同的标准(通过ID递归查找单个控件) 在尝试了一些替代方案后,我想出了一个通用的解决方案。但由于我将经常使用这种方法,我想收集可能的改进 此方法将返回与谓词匹配的所有子控件: 公共静态IEnumerable FindChildControl(此控件为pa

我需要枚举与给定谓词匹配的控件集合,而不管它们的嵌套级别如何

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

后来我意识到,我在过去已经解决了一个问题,非常像这个问题,只是使用了不同的标准(通过ID递归查找单个控件)

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

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

公共静态IEnumerable FindChildControl(此控件为parentControl,
谓词(谓词),其中T:Control
{
foreach(parentControl.Controls中的控件项){
if(谓语(项))
收益回报(T)项;
foreach(item.FindChildControls(谓词)中的T子级){
退换子女;
}
}
}

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

var allTxt = Page.FindChildControls<TextBox>(c => c is TextBox);
var submit = Page.FindChildControls<Button>(c => c.ID == "btnSubmit").First();
var allTxt=Page.FindChildControls(c=>c是文本框);
var submit=Page.FindChildControls(c=>c.ID==“btnSubmit”).First();

如果需要,可以使用队列来消除递归

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

        }
公共静态IEnumerable FindChildControl(Control parentControl,
谓词(谓词),其中T:Control
{
队列q=新队列();
foreach(parentControl.Controls中的控件项)
{
q、 排队(项目);
}
而(q.Count>0)
{
控制项=q.出列();
if(谓语(项))
收益回报(T)项;
foreach(item.Controls中的控件子级)
{
q、 排队(儿童);
}
}
}

如果需要,可以使用队列来消除递归

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

        }
公共静态IEnumerable FindChildControl(Control parentControl,
谓词(谓词),其中T:Control
{
队列q=新队列();
foreach(parentControl.Controls中的控件项)
{
q、 排队(项目);
}
而(q.Count>0)
{
控制项=q.出列();
if(谓语(项))
收益回报(T)项;
foreach(item.Controls中的控件子级)
{
q、 排队(儿童);
}
}
}

这实际上非常整洁,在我的情况下(重页面控制树,每次渲染使用约4-5次),你认为这会是最佳的吗?这实际上非常整洁,在我的情况下(重页面控制树,每次渲染使用约4-5次),你认为这会是最佳的吗?我很喜欢你的版本!简洁的解决方案。我很喜欢你的版本!纯溶液。