在页面上查找特定类型的所有UserControl,可能使用LINQ?

时间:2011-06-29 16:03:39

标签: c# asp.net user-controls

我创建了一个由我的所有用户控件实现的基本用户控件(BaseUserControl)类。在该类中,我有一个包含JavaScript URL引用的集合的属性。解析该类型用户控件的页面的最佳方法是什么?

我尝试使用LINQ,但我认为我不能用它来查询Controls集合:

var controls = (from c in page.Controls where c is BaseUserControl)
foreach(control in controls){
     var javascript = control.JavaScriptReference
}

6 个答案:

答案 0 :(得分:5)

稍微更惯用的方法是使用Enumerable.OfType

foreach(var control in page.Controls.OfType<BaseUserControl>()) {
     var javascript = control.JavaScriptReference;
}

答案 1 :(得分:3)

var javascript = page.Controls.OfType<BaseUserControl>().Select(c=> c.JavaScriptReference);

这应该有效。

答案 2 :(得分:1)

如果您只想要一组JavaScriptReference值,您可以执行以下操作:

var javascriptReferences = page.Controls.Where(c => c is BaseUserControl)
                                        .Select(c => c.JavaScriptReference);

答案 3 :(得分:1)

我使用递归方法来解决这个问题。请参阅下面我通常使用的方法。

private void GetControls<T>(Control ctrl, List<T> result)
{
    foreach (Control con in ctrl.Controls.OfType<Control>().Where(c => c.Controls.Count > 0))
        GetControls<T>(con, result);
    foreach (T control in ctrl.Controls.OfType<T>())
        result.Add(control);
}

您可以这样称呼它:

List<BaseUserControl> baseUserControls = new List<BaseUserControl>();
GetControls<BaseUserControl>(Page.Controls, out baseUserControl);

之后,List将填充对BaseUserControls的引用。递归方法是必要的,因为Page.Controls不包含页面上的所有控件。页面上的某些控件是此集合中的控件的子级(甚至是这些控件的子级),因此嵌套级别更深。因此递归方法。

答案 4 :(得分:0)

您是否正确选择了控件?

var controls = (from c in page.Controls where c is BaseUserControl select c)
foreach(BaseUserControl control in controls)
{     
var javascript = control.JavaScriptReference
}

答案 5 :(得分:0)

foreach (var control in
       page.Controls.OfType<BaseUserControl>())
{
       var javascript = control.JavaScriptReference;
}