Loop attraverso tutti i controlli asp.net pagina web

Ho bisogno di un ciclo attraverso tutti i controlli nel mio asp.net pagina web e fare qualcosa per il controllo. In un esempio: sto facendo un gigante di stringa della pagina e-mail a me stesso, e in un altro caso, sto salvando tutto in un cookie.

Il problema è masterpages e oggetti con le collezioni di controlli all’interno di loro. Voglio essere in grado di passare in una Pagina per il metodo, quindi, che il metodo di essere sufficientemente generico per un ciclo attraverso tutti i controlli interno, la maggior parte dei contenuti della pagina e lavorare con loro. Ho provato a fare questo con la ricorsione, ma il mio ricorsione è incompleta.

Voglio passare un oggetto della Pagina in un metodo, e il metodo di un ciclo attraverso tutti i controlli nella parte più interna del contenuto della pagina. Come posso realizzare questo?

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

Senza Try/catch

Riferimento a un oggetto non impostato su un’istanza di un oggetto.

On line controlID = …..

Qual è l’errore che hai trovato?
Nessun errore, la mia stringa semplicemente non hanno voci in rappresentanza di ogni controllo.
Il motivo non stai ricevendo un errore, infatti, si dispone di un blocco try/catch nascondendo. Rimuovere e vediamo cosa succede.
Vedi l’ultima modifica.

OriginaleL’autore MAW74656 | 2010-11-23

6 Replies
  1. 8

    Originale metodo non funziona se si inizia dall’elemento radice del documento: qualcosa come pagina.I controlli, come si avrà solo un ciclo attraverso il primo livello di controlli, ma ricordo di un controllo può essere composito. Quindi è necessario ricorsione a tirare fuori.

            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);
                          }
                      }
    
    
                }  
    
            }
    Ok, quindi posso passare un oggetto della Pagina in questo? Quello che posso passare in questo?
    Inoltre, qual è il vantaggio di usare var c Controllo c?
    Zucchero sintattico”, sono la stessa cosa
    Quindi, se io sto cercando di Caselle di testo, verifica se il controllo corrente è una casella di testo, aggiungere e verificare se la casella di testo ha controlli figlio? Che cosa succede se sto cercando di caselle di testo e il controllo corrente è un pannello in cui la mia textbox risiede? Questo codice non sembra tenerne conto.

    OriginaleL’autore dexter

  2. 25

    Sono un po ‘ come David Finleys linq approccio 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;
            }
        }
    }

    Uso:

    //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();
    +1 perché… ti meriti uno!
    A proposito… funziona!
    Questo non funziona in ASP.net 2 o VS2005

    OriginaleL’autore Daniel Powell

  3. 2
    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!
                            }
                        }
                    }
                }
            }
        }
    }

    Questo dovrebbe farlo. Anche se potrebbe essere necessario fare un po ‘ il controllo per assicurarsi che si sta effettivamente fare con il corretto ContentPlaceHolder se c’è più di uno.

    OriginaleL’autore Bob

  4. 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
    Come fare questo in C#?
    Non so se questo è rilevante per il ASP.net domanda.
    Lingua non mi dispiace.

    OriginaleL’autore Ali Tarhini

  5. 0

    Questo ha funzionato per me ..

    Basta assicurarsi che l’ID di tutti i controlli a partire con i prefissi indicati di seguito. vale a dire: <asp:TextBox ID="TextBoxEmail"...> per esempio. Altrimenti il parser non in grado di rilevare il vostro controllo. Se qualcuno ha un modo migliore di analizzare senza sapere /hard-codifica l’ID dei controlli, che sarebbe ancora più dolce.

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

    E a chiamata, passando oggetto Pagina …

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

    OriginaleL’autore Fandango68

  6. 0

    Si prega di trovare il codice di seguito. Questo dovrebbe aiutare con tutti i controlli necessari. Si dovrebbe essere in grado di utilizzare la Pagina Web dei Controlli, così come ASP.NET Controlli.

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

    OriginaleL’autore Jagadheesh Venkatesan

Lascia un commento