2010-11-23 3 views
6

Мне нужно пройти через все элементы управления на моей веб-странице asp.net и сделать что-то для элемента управления. В одном случае я делаю гигантскую строку из страницы и отправляю ее по электронной почте, а в другом случае я сохраняю все в куки.Прокрутите все элементы управления на веб-странице asp.net

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

Я хочу передать объект страницы в метод и пропустить этот метод через все элементы управления на самой внутренней странице содержимого. Как я могу это достичь?

private static String controlToString(Control control) 
{ 
    StringBuilder result = new StringBuilder(); 

    String controlID = String.Empty; 

    Type type = null; 

    foreach (Control c in control.Controls) 
    { 
     try 
     { 
      controlID = c.ID.ToString(); 

      if (c is IEditableTextControl) 
      { 
       result.Append(controlID + ": " + ((IEditableTextControl)c).Text); 
       result.Append("<br />"); 
      } 
      else if (c is ICheckBoxControl) 
      { 
       result.Append(controlID + ": " + ((ICheckBoxControl)c).Checked); 
       result.Append("<br />"); 
      } 
      else if (c is ListControl) 
      { 
       result.Append(controlID + ": " + ((ListControl)c).SelectedValue); 
       result.Append("<br />"); 
      } 
      else if (c.HasControls()) 
      { 
       result.Append(controlToString(c)); 
      } 

      //result.Append("<br />"); 
     } 
     catch (Exception e) 
     { 

     } 
    } 

    return result.ToString(); 
} 

Без Try/уловом

объекта не задана ссылка на экземпляр объекта.

На линии ControlID = .....

+0

Какая ошибка вы получаете? – 2010-11-23 19:25:21

+0

Нет ошибки, моя строка просто не имеет записей, представляющих каждый элемент управления. – MAW74656 2010-11-23 19:26:01

+0

Причина, по которой вы не получаете сообщение об ошибке, заключается в том, что у вас есть блок try/catch, скрывающий ее. Удалите это и посмотрите, что произойдет. – 2010-11-23 19:52:48

ответ

8

Ваш оригинальный метод не будет работать, если вы начинаете с корневого элемента документа: что-то вроде page.Controls, как вы будете только через петлю первый уровень элементов управления, но помните, что элемент управления может быть составным. Поэтому вам нужна рекурсия, чтобы снять это.

 public void FindTheControls(List<Control> foundSofar, Control parent) 
     { 

      foreach(var c in parent.Controls) 
      { 
        if(c is IControl) //Or whatever that is you checking for 
        { 

         foundSofar.Add(c); 

         if(c.Controls.Count > 0) 
         { 
          this.FindTheControls(foundSofar, c); 
         } 
        } 


      } 

     } 
0
sub getcontrols(byref c as control, byref allControls as list(of control) 
if c isnot nothing 
allcontrols.add(c) 
if c.controls.count>0 then 
for each ctrl as control in c.controls 
getcontrols(ctrl,allcontrols) 
next 
end if 
1
foreach (Control ctlMaster in Page.Controls) 
{ 
    if (ctlMaster is MasterPage) 
    { 
     foreach (Control ctlForm in ctlMaster.Controls) 
     { 
      if (ctlForm is HtmlForm) 
      { 
       foreach (Control ctlContent in ctlForm.Controls) 
       { 
        if (ctlContent is ContentPlaceHolder) 
        { 
         foreach (Control ctlChild in ctlContent.Controls) 
         { 
          //Do something! 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Это должно сделать это. Хотя вам может понадобиться сделать некоторые проверки, чтобы убедиться, что вы действительно имеете дело с правильным ContentPlaceHolder, если их несколько.

23

Я скорее как Дэвид Finleys LinQ подход к FindControl http://weblogs.asp.net/dfindley/archive/2007/06/29/linq-the-uber-findcontrol.aspx

public static class PageExtensions 
{ 
    public static IEnumerable<Control> All(this ControlCollection controls) 
    { 
     foreach (Control control in controls) 
     { 
      foreach (Control grandChild in control.Controls.All()) 
       yield return grandChild; 

      yield return control; 
     } 
    } 
} 

Использование:

// get the first empty textbox 
TextBox firstEmpty = accountDetails.Controls 
    .All() 
    .OfType<TextBox>() 
    .Where(tb => tb.Text.Trim().Length == 0) 
    .FirstOrDefault(); 

// and focus it 
if (firstEmpty != null) 
    firstEmpty.Focus(); 
0

Это работает для меня ..

Просто убедитесь, что вы ID все ваши средства управления, начиная с префиксы, показанные ниже. например: <asp:TextBox ID="TextBoxEmail"...>. В противном случае анализатор не обнаружит ваш контроль. Если у кого-то есть лучший способ разбора без знания/жесткого кодирования идентификатора элементов управления, это будет еще слаще.

protected String GetControls(Control control) 
{ 
    //Get text from form elements 
    String text = ""; 
    foreach (Control ctrl in control.Controls) 
    { 
     if (ctrl.ClientID.Contains("TextBox")) 
     { 
      TextBox tb = (TextBox)ctrl; 
      text += tb.ID.Replace("TextBox", "") + ": " + tb.Text + "<br />"; 
     } 
     if (ctrl.ClientID.Contains("RadioButtonList")) 
     { 
      RadioButtonList rbl = (RadioButtonList)ctrl; 
      text += rbl.ID.Replace("RadioButtonList", "") + ": " + rbl.SelectedItem.Text + "<br />"; 
     } 
     if (ctrl.ClientID.Contains("DropDownList")) 
     { 
      DropDownList ddl = (DropDownList)ctrl; 
      text += ddl.ID.Replace("DropDownList", "") + ": " + ddl.SelectedItem.Text + "<br />"; 
     } 

     if (ctrl.ClientID.Contains("CheckBox")) 
     { 
      CheckBox cb1 = (CheckBox)ctrl; 
      text += cb1.ID.Replace("CheckBox", "") + ": " + cb1.Text + "<br />"; 
     } 

     if (ctrl.HasControls()) 
      text += GetControls(ctrl); 
    } 

    return text; 
} 

И называть его, передавая объект страницу ...

String log; 
foreach (Control ctrl in Page.Controls) 
    log += GetControls(ctrl); 
0

Пожалуйста, найдите код, приведенный ниже. Это должно помочь вам со всеми необходимыми элементами управления. Вы должны иметь возможность использовать элементы управления веб-страницы, а также элементы управления ASP.NET.

public partial class Default : System.Web.UI.Page 
{ 

List<Control> lstControl = new List<Control>(); 

protected void Page_Load(object sender, EventArgs e) 
{ 

} 

private List<Label> getLabels() // Add all Lables to a list 
{ 
    List<Label> lLabels = new List<Label>(); 

    foreach (Control oControl in Page.Controls) 
    { 
     GetAllControlsInWebPage(oControl); 
    } 

    foreach (Control oControl in lstControl) 
    { 
     if (oControl.GetType() == typeof(Label)) 
     { 
      lLabels.Add((Label)oControl); 
     } 
    } 
    return lLabels; 
} 

protected void GetAllControlsInWebPage(Control oControl) 
{ 
    foreach (Control childControl in oControl.Controls) 
    { 
     lstControl.Add(childControl); //lstControl - Global variable 
     if (childControl.HasControls()) 
      GetAllControlsInWebPage(childControl); 
    } 
} 

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