2010-04-13 4 views
5

Хотите пройти через все пользовательские элементы управления, которые существуют на странице и получить их идентификаторы. Как мне это сделать?Прокрутите все пользовательские элементы управления на странице

+0

Является ли это WinForms, WPF или ASP.NET? Я подозреваю последнего, но ты никогда не знаешь. – ChrisF

+0

Под «пользовательскими элементами управления» вы подразумеваете * управляемые элементы управления * или, в частности, пользовательские элементы управления (.ascx)? – CAbbott

+0

@ChrisF: Вы догадались это правильно! ASP.Net это @CAbbott: .ascx –

ответ

11

Чтобы получить каждый пользовательский элемент управления, вы должны проверить Тип управления:

EDIT: Я изменил мой пример, чтобы пройти через все элементы управления рекурсивно:

метод

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. Это не работает –

+1

Что не работает? – CAbbott

+0

if (curControl - UserControl) никогда не будет истинным. И у меня есть usercontrol на странице –

2
foreach(Control control: Page.Controls) 
{ 

    //do something with control object 

} 
+0

Но тогда он проходит через все элементы управления. Как можно дифференцировать пользовательский контроль. GetType() ?? –

+1

Элементы управления могут быть вложенными, поэтому вам нужна рекурсивная функция для циклического переключения всех элементов управления. –

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 
Смежные вопросы