2009-05-17 6 views
7

Y at-il une différence entre ces deux scénarios:Comment accéder aux contrôles dans une page maître imbriquée? pourquoi se comporte-t-il différemment des pages de contenu?

(1) L'accès à une propriété sur une page principale d'un enfant régulier

(2) L'accès à une propriété sur une page principale à partir d'une page maître imbriquée

J'ai essayé d'accéder à une zone de texte dans la page principale d'une page de contenu comme ceci:

TextBox a; 
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive 
defaultTextbox.Text = a.Text; // defaultTextBox is a textbox control inside default.aspx 

cela fonctionne, mais quand j'ai appliqué la même méthode sur une page maître imbriquée:

TextBox a; 
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive 
myTextBox.Text = a.Text; // myTextBox is a textbox control inside child.master 

cela ne fonctionne pas, ai-je oublié quelque chose? J'appelle les deux codes à l'intérieur de regulare charger page_load ...

J'ai également remarqué que je ne peux pas définir la valeur de la zone de texte à l'intérieur de la page maître imbriquée du code derrière, il y a définitivement quelque chose qui manque, qu'est-ce que c'est? Pour faire la lumière sur cette question, voici un exemple:

Nested Maître Page:

<%@ Master Language="C#" MasterPageFile="MasterPage.master" AutoEventWireup="false" CodeFile="MasterPage2.master.cs" Inherits="MasterPage2" %> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 

<asp:textbox id="tx2" runat="server" text="this is two"></asp:textbox> 
<asp:contentplaceholder id="newstuff" runat="server"></asp:contentplaceholder> 
</asp:Content> 

code derrière:

Response.Wrote(tx2.Text); 

Je ne reçois rien, pourquoi qu'est-ce que je manque? note que j'ai aussi essayé le contrôle de recherche récursive:

String str = ((TextBox)((Content)FindControl("Content2")).FindControl("tx2")).Text; 

encore rien

Répondre

4

J'ai lu quelques petites choses ici: http://www.odetocode.com/Articles/450.aspx et j'ai découvert que la page imbriquée au centre n'appelle jamais Page_Load! à la place, il déclenche un événement de charge que vous pouvez prendre pour définir quelles que soient les champs, donc la réponse était: à la page imbriquée effectuer les tâches suivantes:

protected override void OnLoad(EventArgs e) 
    { 
     myTextBox.Text = "anything"; 
     base.OnLoad(e); 
    } 
+0

Si la page maître imbriquée n'appelle pas Page_Load, une autre erreur se produit également car toutes les méthodes Page_Load doivent être appelées (sur la page maître, la page maître imbriquée et la page de contenu). J'ai ajouté quelques informations à ma réponse originale. –

2

Cela devrait fonctionner sans aucun problème, donc autre chose doit être faux. Je l'ai juste essayé dans un projet de test simple et je n'ai aucun problème à trouver un contrôle sur la page maître dans les deux cas.

Je vérifie (à nouveau) si vous vous référez à la bonne page maître à l'intérieur de votre page maître imbriquée. Vous pouvez également vérifier le type d'exécution de la propriété Master à l'intérieur de votre page maître imbriquée. Cela devrait être le type de votre page maître. : Je pensais que le problème consistait à trouver un contrôle dans la page maître racine à partir d'une page maître imbriquée et cela devrait fonctionner sans aucun problème. Pour rechercher un contrôle à l'intérieur d'un espace réservé de contenu dans une page maître imbriquée, consultez la page suivante forum post.

+0

Je viens de créer un nouveau projet à partir de zéro, j'ai toujours les mêmes résultats! Je ne peux pas accéder à quoi que ce soit sur la page imbriquée centrale – Ayyash

+0

Je pensais que votre question concernait l'accès aux propriétés de la page principale racine à partir d'une page maître imbriquée et d'une page de contenu. J'essaierai de voir si je peux faire fonctionner otrher snenario: accéder à une propriété sur une page maître imbriquée à partir d'une page de contenu. –

5
ContentPlaceHolder cp = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1"); 
    //base content place holder id 

Label objLabel3 = (Label)cp.FindControl("lblNested"); 
    //lblNested is id in nested master page 
0

Vous pouvez avoir un contrôle absolu de votre contenu à la fois maître page et page imbriquée à partir de votre page de contenu en utilisant les directives:

<%@ MasterType VirtualPath="your_master.master" %> 
<%@ Reference VirtualPath="~/your_master.master" %> 

Voir l'excellent article de K.Scott Allen en Ode To Code

Questions connexes