Простой способ использовать FindControl (“”)

C#

Привет,

Я разрабатывал c# веб-приложения в течение нескольких лет и существует одна проблема, я продолжаю приезжать upagainst, который я не могу найти логический способ решить.

Я имею контроль, к которому я хочу получить доступ в коде позади, это управление глубоко в разметке; проложенный под землей в ContentPlaceHolders, UpdatePanels, Панелях, GridViews, EmptyDataTemplates, TableCells (или безотносительно структурируют Вас, нравится.. точка - это, имеет больше родителей, чем farthers для справедливости).

Как я могу использовать FindControl("") получить доступ к этому управлению, не делая этого:

Page.Form.Controls[1].Controls[1].Controls[4].Controls[1].Controls[13].Controls[1].Controls[0].Controls[0].Controls[4].FindControl("");
8
задан Residuum 5 February 2010 в 16:48
поделиться

2 ответа

Напишите вспомогательный метод под названием FindControlRecursive, предоставленный самим Джеффом Атвудом (Jeff Atwood).

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id)
    { 
        return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
        Control t = FindControlRecursive(c, id); 
        if (t != null) 
        { 
            return t; 
        } 
    } 

    return null; 
} 

Recursive Page.FindControl

12
ответ дан 5 December 2019 в 11:24
поделиться

Использовать рекурсивный FindControl:

public T FindControl<T>(string id) where T : Control
   {
       return FindControl<T>(Page, id);
   }

   public static T FindControl<T>(Control startingControl, string id) where T : Control
   {
       // this is null by default
       T found = default(T);

      int controlCount = startingControl.Controls.Count;

      if (controlCount > 0)
      {
          for (int i = 0; i < controlCount; i++)
          {
              Control activeControl = startingControl.Controls[i];
              if (activeControl is T)
              {
                 found = startingControl.Controls[i] as T;
                  if (string.Compare(id, found.ID, true) == 0) break;
                  else found = null;
              }
              else
              {
                  found = FindControl<T>(activeControl, id);
                  if (found != null) break;
              }
          }
      }
      return found;
  }  
3
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: