Loop through all controls on asp.net webpage

后端 未结 7 1346
攒了一身酷
攒了一身酷 2020-12-01 22:17

I need to loop through all the controls in my asp.net webpage and do something to the control. In one instance I\'m making a giant string out of the page and emailing it to

相关标签:
7条回答
  • 2020-12-01 22:42
    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!
                            }
                        }
                    }
                }
            }
        }
    }
    

    This should do it. Though you might need to do some checking to make sure you're actually dealing with the correct ContentPlaceHolder if there's more than one.

    0 讨论(0)
  • 2020-12-01 22:43

    I rather like David Finleys linq approach to 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;
            }
        }
    }
    

    Usage:

    // 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 讨论(0)
  • 2020-12-01 22:48

    This worked for me ..

    Just make sure you ID all your controls starting with the prefixes shown below. ie: <asp:TextBox ID="TextBoxEmail"...> for example. Otherwise the parser will not detect your control. If someone has a better way of parsing without knowing / hard-coding the ID of the controls, that would be even sweeter.

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

    And to call it, passing Page object ...

    String log;
    foreach (Control ctrl in Page.Controls)
        log += GetControls(ctrl);
    
    0 讨论(0)
  • 2020-12-01 22:49
    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
    
    0 讨论(0)
  • 2020-12-01 22:51

    Please find the below code. This should help you with all the controls you need. You should be able to use Web Page Controls, as well as ASP.NET Controls.

    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);
        }
    }
    
    }
    
    0 讨论(0)
  • 2020-12-01 23:00

    Your original method will not work if you start from the root element of your document: something like page.Controls as you will only loop through the first level of controls, but remember a control can be composite. So you need recursion to pull that off.

            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 讨论(0)
提交回复
热议问题