Trouver des commandes imbriquées à l'intérieur des pages maîtres
J'ai une page principale qui est imbriqué 2 niveaux. Il a une page maître, et que les maîtres de la page est une page maître.
Quand je colle des contrôles dans un ContentPlaceHolder avec le nom "rcb" - je trouver les contrôles comme suit:
Label lblName =(Label)Master.Master.FindControl("bcr").FindControl("bcr").FindControl("Conditional1").FindControl("ctl03").FindControl("lblName");
Je suis totalement perdu? Ou est-ce la façon dont il doit être fait?
Je suis sur le point de travailler avec un MultiView, qui est à l'intérieur d'une condition de contrôle du contenu. Donc, si je veux changer de point de vue, je dois obtenir une référence à ce droit de contrôle? L'obtention de cette référence va être encore plus méchant! Est-il un meilleur moyen?
Grâce
OriginalL'auteur user53885 | 2009-04-08
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous devez savoir que les MasterPages réellement s'asseoir à l'intérieur des Pages. Si bien qu'une MasterPage événement Load est en fait appelé après votre ASPX événement Load.
Cela signifie, la Page de l'objet est en fait le plus de contrôle dans le contrôle de la hiérarchie.
Donc, sachant cela, le meilleur moyen de trouver un contrôle dans un tel imbriquée à l'environnement, est d'écrire une fonction récursive qui parcourt tous les contrôle et les contrôles enfants jusqu'à trouver celui que vous cherchez. dans ce cas, votre MasterPages sont en fait des enfants des contrôles de la Page principale de contrôle.
Vous rendre à la Page principale de l'objet à l'intérieur de tout contrôle, comme ceci:
C#:
.Page;
VB.NET
Moi.Page
Je trouve qu'en général, la classe de Contrôle FindControl() la méthode est assez inutile, que l'environnement est toujours imbriquée.
Parce que si ce, j'ai décidé d'utiliser .NET 3.5 de nouvelles fonctionnalités d'Extension pour étendre la classe de Contrôle.
En utilisant le code ci-dessous (VB.NET), de dire, de votre AppCode dossier, toutes vos commandes seront désormais effectuer une recherche récursive en appelant FindByControlID()
OriginalL'auteur andy
Trouver des contrôles est une douleur, et j'ai été en utilisant cette méthode qui j'ai eu de la CodingHorror blog tout à fait il ya un moment, avec une seule modification qui retourne null si vide id est passé en.
Dans votre cas, je pense que vous auriez besoin de ce qui suit:
À l'aide de cette méthode est généralement beaucoup plus pratique, car vous n'avez pas besoin de savoir exactement où réside le contrôle de la trouver (en supposant que vous connaissez l'ID, bien sûr), mais si vous avez les contrôles imbriqués avec le même nom, vous obtiendrez probablement un comportement étrange, de sorte que peut-être quelque chose à regarder dehors pour.
+1 merci cela m'a aussi aidé à sortir
+1 je sais que ce n'est que 5 ans, mais cette méthode m'a sauvé quelques maux de tête, merci!
OriginalL'auteur Mun
Bien que j'aime la récursivité, et d'accord avec andy et de Mun, une autre approche, vous souhaitez mai à envisager est d'avoir un fortement typé page principale. Tout ce que vous avez à faire est d'ajouter une directive dans votre page aspx.
Au lieu d'accéder à une page de commande à partir de votre page maître, envisager d'accéder à un contrôle dans votre page maître à partir de la page elle-même. Cette approche fait beaucoup de sens quand vous avez un en-tête de l'étiquette sur votre page maître, et que vous voulez définir sa valeur à partir de chaque page qui utilise le maître.
Je ne suis pas sûr à 100%, mais je pense que ce serait plus simple technique avec les pages maîtres imbriquées, comme vous le feriez suffit de pointer la VirtualPath le maître contenant le contrôle que vous souhaitez accéder. Il pourrait être difficile, mais si vous voulez avoir accès à deux contrôles, un dans chaque page maître.
OriginalL'auteur Aaron Daniels
Voici un code qui est plus générique et fonctionne avec une condition personnalisée (qui peut être une expression lambda!)
Appel:
Extension de la commande
OriginalL'auteur Raevean
J'ai utilisé le
<%@ MasterType VirtualPath="~/MyMaster.master" %>
méthode. J'ai une propriété dans le principal maître page, puis dans le détail de la page maître à d'autres biens du même nom de l'appel de la principale propriété master et il fonctionne très bien.J'ai cela dans le principal de la page maître
c'est juste un élément div qui ont pour afficher un message d'erreur. Je voudrais utiliser cette même propriété dans les pages avec le détail de la page maître(c'est imbriquée avec le principal maître).
Ensuite, dans le détail, maître, j'ai ce
Im l'appel de la principale propriété de la détail de maître pour créer le même comportement.
OriginalL'auteur Juan
Je viens de recevoir il fonctionne parfaitement.
Dans contentpage.aspx, j'ai écrit ce qui suit:
If Master.Master.connectsession.IsConnected Then
my coded comes in here
End If
OriginalL'auteur ebot64