2017-01-26 2 views
3

У меня есть набор из трех MasterPages с различными фильтрами на них, состоящий из dropdownlists. Когда я вставляю страницы, я хочу заполнить эти выпадающие меню с помощью вспомогательного класса в папке App_Code, чтобы уменьшить повторяющийся код. Проблема у меня в том, что я не могу найти эти выпадающие списки в MasterPage, полученный ниже метод. Можно ли это сделать или я должен изучить другие варианты?ASP.NET Доступ к элементам управления из MasterPage с использованием только экземпляра из него

Я попытался сначала найти ContentPlaceHolder, а затем поиска, но не может найти ContentPlaceholder на выпадающие в.
Я также пытался получить доступ к родителю и оттуда найти ContentPlaceHolder, но не кости.

Другие варианты отправки выпадающих списков этого класса и их заполнения, что является более простым решением. Но я хочу сначала изучить это общее решение.

public static void FillFilters(MasterPage page) { 

    DropDownList[] dropdowns = new DropDownList[3]; 
    dropdowns[0] = (DropDownList)page.FindControl("StatusDropDown"); 
    dropdowns[1] = (DropDownList)page.FindControl("DepartmentDropDown"); 
    dropdowns[2] = (DropDownList)page.FindControl("EmployeeDropDown"); 
    ...code filling the dropdowns etc. etc. 

ответ

2

Попробуйте этот способ расширения. Вам не нужно MasterPage, так что контроль должен родитель текущего контроля

public static class ControlsExtensionMethods 
{ 
    public static Control FindControlRecursive(this Control root, string id) 
    { 
     if (id == string.Empty) 
     { 
      return null; 
     } 


     if (root.ID == id) 
     { 
      return root; 
     } 

     foreach (Control nestedControl in root.Controls) 
     { 
      Control foundedControlInNested = FindControlRecursive(nestedControl, id); 
      if (foundedControlInNested != null) 
      { 
       return foundedControlInNested; 
      } 
     } 
     return null; 
    } 
} 
+0

Это работало безупречно, спасибо! Я видел это решение раньше, но не думал, что это может мне помочь. – HighestPie

+1

Добро пожаловать ^^ –

0

Чтобы добавить на Хуану ответ (возможно, это должно быть прав?) Я решил использовать следующий в моем окончательном коде :

public static void FillFilters(MasterPage page) { 
    Control parent = page.Controls[0]; 

    DropDownList[] dropdowns = new DropDownList[3]; 
    dropdowns[0] = (DropDownList)parent.FindControlRecursive("StatusDropDown"); 
    dropdowns[1] = (DropDownList)parent.FindControlRecursive("DepartmentDropDown"); 
    dropdowns[2] = (DropDownList)parent.FindControlRecursive("EmployeeDropDown"); 

Поскольку я использую MasterPage позже в методе.

Смежные вопросы