2 votes

ASP.NET - FindControl dans une page maître imbriquée

Comment accéder de manière pratique à un contrôle dans un emboîté page principale ?


L'accès aux contrôles des pages maîtres est généralement simple :

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

Cependant, lorsque ma configuration est la suivante, le contrôle est introuvable, probablement parce qu'il se trouve dans un fichier de type content bloc :

1 Root Master

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

2 maîtres emboîtés

<%@ 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 Page de contenu VB.NET

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

Solution de rechange

J'ai trouvé une solution en remontant l'arbre et en trouvant l'emplacement du contenu de la racine. cphMainContent et ensuite chercher le contrôle à l'intérieur.

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

Cette solution semble toutefois très détournée et inefficace.

Est-il possible d'accéder au contrôle directement à partir de l'application content de la page principale ?

2voto

mac9416 Points 931

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 suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X