循环遍历页面上的所有用户控件

问题描述:

想要遍历页面上存在的所有用户控件并获取其ID。我该怎么做?循环遍历页面上的所有用户控件

+0

这是的WinForms,WPF或ASP.NET?我怀疑后者,但你永远不知道。 – ChrisF 2010-04-13 18:50:11

+0

“用户控件”是指*托管控件*还是特定用户控件(.ascx)? – CAbbott 2010-04-13 18:51:06

+0

@ChrisF:你猜对了! ASP.Net它是 @CAbbott:.ascx – 2010-04-13 18:51:36

要获得每个用户控制,你必须测试控制的类型:

编辑:我修改我的例子去通过递归的所有控件:

方法

public void GetUserControls(ControlCollection controls) 
{ 
    foreach (Control ctl in controls) 
    { 
     if (ctl is UserControl) 
     { 
      // Do whatever. 
     } 

     if (ctl.Controls.Count > 0) 
      GetUserControls(ctl.Controls); 
    } 
} 

调用

GetUserControls(Page.Controls); 
+0

Nah。这不起作用 – 2010-04-13 19:00:00

+1

什么不适用于它?如果(curControl是UserControl)从不为真,则为 – CAbbott 2010-04-13 19:02:29

+0

。并且我在页面上有一个用户控件 – 2010-04-13 19:06:33

foreach(Control control: Page.Controls) 
{ 

    //do something with control object 

} 
+0

但是,它通过所有控件循环。用户控件如何区分。的GetType()? – 2010-04-13 18:53:58

+1

控件可以嵌套,因此您需要递归函数来遍历所有控件。 – 2010-04-13 18:55:27

这应该工作:

var listOfUserControls = GetUserControls(Page); 

... 

public List<UserControl> GetUserControls(Control ctrl) 
{ 
    var uCtrls = new List<UserControl>(); 
    foreach (Control child in ctrl.Controls) { 
    if (child is UserControl) uCtrls.Add((UserControl)child); 
    uCtrls.AddRange(GetUserControls(child); 
    } 

    return uCtrls; 
} 

我创建了一个扩展方法来做到这一点,这与LINQ真的很好的作品。

<Extension()> 
Public Function DecendentControls(ParentControl As Control) As Control() 
    Dim controls As New List(Of Control) 

    For Each myControl As Control In ParentControl.Controls 
     controls.Add(myControl) 
     controls.AddRange(myControl.DecendentControls) 
    Next 

    Return controls.ToArray 
End Function 

然后用LINQ,你可以做这样的事情在页面上的所有复选框设置为未选中:

For Each myControl As CheckBox In pnlMain.DecendentControls.Where(Function(x) TypeOf x Is CheckBox) 
    myControl.Checked = False 
Next