2010-04-13 39 views
5

想要遍歷頁面上存在的所有用戶控件並獲取其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

回答

11

要獲得每個用戶控制,你必須測試控制的類型:

編輯:我修改我的例子去通過遞歸的所有控件:

方法

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

2
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

3

這應該工作:

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

我創建了一個擴展方法來做到這一點,這與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