2016-12-08 1 views
2

Comment accéder facilement à un contrôle dans un page imbriquée?ASP.NET - FindControl dans la page maître imbriquée


Accès commandes page principale est généralement simple:

Dim ddl As DropDownList = Master.FindControl("ddl") 

Cependant, lorsque ma configuration est comme suit le contrôle ne peut pas être trouvé, sans doute cela parce que le contrôle est dans un bloc content:

1 maître racine

<asp:ContentPlaceHolder ID="cphMainContent" runat="server" /> 

2 Nested Maître

<%@ Master Language="VB" MasterPageFile="~/Root.master" AutoEventWireup="false" CodeFile="Nested.master.vb" Inherits="Nested" %> 

<asp:Content ID="MainContent" ContentPlaceHolderID="cphMainContent" runat="server"> 
    <asp:DropDownList ID="ddl" runat="server" DataTextField="Text" DataValueField="ID"/> 
</asp:Content> 

3 Sommaire Page VB.NET

Dim ddl As DropDownList = Master.FindControl("ddl") 

Solution

J'ai trouvé une solution en traversant la découverte de l'arbre l'endroit du contenu racine titulaire cphMainContent et ensuite en cherchant le contrôle à l'intérieur.

cphMainContent = CType(Master.Master.FindControl("cphMainContent"), ContentPlaceHolder) 
Dim ddl As DropDownList = cphMainContent .FindControl("ddl") 

Cependant cette solution semble très détournée et inefficace.

Le contrôle peut-il être accédé directement depuis le bloc content de la page maître?

+0

Bien que je ne sache pas exactement pourquoi vos pages sont structurées de cette façon, je vous conseille d'exposer les données de contrôles via les propriétés de votre hiérarchie de pages afin de ne pas avoir à faire la notation par points FindControl ("") vulnérable restructuration et exécutions d'exécution. Au lieu d'exposer les propriétés sur votre page maître, définissez les propriétés sur la page maître, puis accédez-les typesafe à partir des pages enfants. –

Répondre

2

Voici une méthode d'extension qui peut gérer un nombre arbitraire de niveaux d'imbrication:

public static class PageExtensions 
{ 
    /// <summary> 
    /// Recursively searches this MasterPage and its parents until it either finds a control with the given ID or 
    /// runs out of parent masters to search. 
    /// </summary> 
    /// <param name="master">The first master to search.</param> 
    /// <param name="id">The ID of the control to find.</param> 
    /// <returns>The first control discovered with the given ID in a MasterPage or null if it's not found.</returns> 
    public static Control FindInMasters(this MasterPage master, string id) 
    { 
     if (master == null) 
     { 
      // We've reached the end of the nested MasterPages. 
      return null; 
     } 
     else 
     { 
      Control control = master.FindControl(id); 

      if (control != null) 
      { 
       // Found it! 
       return control; 
      } 
      else 
      { 
       // Search further. 
       return master.Master.FindInMasters(id); 
      } 
     } 
    } 
} 

Utilisez la méthode d'extension de toute classe héritant de System.Web.UI.Page comme ceci:

DropDownList ddl = (DropDownList)Page.Master.FindInMasters("ddl"); 
if (ddl != null) 
{ 
    // do things 
} 
+1

Un peu en retard pour m'aider mais merci. Cela semble être une bonne idée. – Obsidian