6
votes

Boucle via toutes les commandes sur la page Web ASP.NET

J'ai besoin de boucler à travers toutes les commandes de ma page Web ASP.NET et de faire quelque chose au contrôle. Dans une instance, je fais une ficelle géante hors de la page et je suis envoyé par courrier électronique à moi-même, et dans un autre cas, je sauvegarde tout dans un cookie.

Le problème est des chefs-pages et des articles avec des collections de contrôles à l'intérieur d'eux. Je veux pouvoir passer à une page sur la méthode, puis cette méthode est suffisamment générique pour boucler toutes les commandes de la page de contenu intérieure et travailler avec eux. J'ai essayé de faire cela avec une récursion, mais ma récursion est incomplète.

Je veux transmettre un objet de page dans une méthode et que cette méthode soit en boucle via toutes les commandes de la page de contenu la plus interne. Comment puis-je atteindre cela? xxx

sans essayer / attraper

Référence d'objet non définie sur une instance d'un objet.

sur commande de ligne = .....


3 commentaires

Quelle est l'erreur que vous obtenez?


Aucune erreur, ma chaîne n'a tout simplement pas d'entrées représentant chaque contrôle.


La raison pour laquelle vous n'obtenez pas une erreur est parce que vous avez un bloc d'essai / capture de capture. Supprimez cela et voyez ce qui se passe.


7 Réponses :


0
votes
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 commentaires

Je ne suis pas sûr que cela soit pertinent pour la question ASP.NET.



8
votes

Votre méthode d'origine ne fonctionnera pas si vous commencez à partir de l'élément racine de votre document: quelque chose comme la page.Controls, car vous ne ferez que boucler le premier niveau de contrôle, mais rappelez-vous qu'un contrôle peut être composite. Donc, vous avez besoin de récursion pour tirer cela.

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


            }  

        }


5 commentaires

Ok, alors puis-je passer un objet de page dans ceci? Que puis-je passer à cela?


En outre, quel est l'avantage d'utiliser Var C sur le contrôle C?


@ Maw74656 sucre syntaxique, ils sont les mêmes


Donc, si je recherche des zones de texte, cela vérifiera si le contrôle actuel est une zone de texte, l'ajoutez-le, puis vérifiez si cette zone de texte a des contrôles d'enfants? Et si je recherche des boîtes de texte et que le contrôle actuel est un panneau dans lequel ma zone de texte réside? Ce code ne semble pas tenir compte de cela.


À ma compréhension, des boîtes de texte, des étiquettes, des cases à cocher, etc. ne sont pas des conteneurs, une zone de texte ne peut donc pas contenir de zone de texte, donc si vous recherchez des zones de texte, il les trouvera même dans un panneau enfant.



3
votes
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 commentaires

25
votes

J'aime plutôt que david finleys linq approche de FindControl http://weblogs.asp.net/dfinindley/archive/2007/06/29/linq-the-uber-finindcontrol.aspx XXX

Utilisation: < / p> xxx


0 commentaires

0
votes

Cela a fonctionné pour moi ..

Assurez-vous de vous assurer que vous identifiez toutes vos commandes commençant par les préfixes indiquées ci-dessous. IE: par exemple. Sinon, l'analyseur ne détectera pas votre contrôle. Si quelqu'un a une meilleure façon de manifester sans savoir / codir dur l'ID des commandes, ce serait même plus doux. xxx

et d'appeler l'objet de page. .. xxx


0 commentaires

0
votes

Veuillez trouver le code ci-dessous. Cela devrait vous aider avec tous les contrôles dont vous avez besoin. Vous devriez pouvoir utiliser des contrôles de page Web, ainsi que des contrôles 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);
    }
}

}


0 commentaires

-1
votes

Même si cette question a été discutée depuis plus de 9 ans, je quitte ici le code qui a fonctionné pour moi basé sur le code de @jagadheesh venkatesan.

private List<Control> getControls()
{
    List<Control> lControls = new List<Control>();
    foreach (Control oControl in Page.Controls)
        foreach (Control childControl1 in oControl.Controls)
            foreach (Control childControl2 in childControl1.Controls)
                foreach (Control childControl3 in childControl2.Controls)
                    if (childControl3.GetType().ToString().Contains("System.Web.UI.WebControls"))
                        lControls.Add(childControl3);
    return lControls;
}


0 commentaires