web-dev-qa-db-fra.com

Comment obtenir la page parent d'un contrôle utilisateur dans un site Web ASP.NET (pas une application Web)

Tout comme le sujet demande.

EDIT 1

Peut-être est-il possible, pendant le traitement de la demande, de stocker une référence à la page parent dans le contrôle utilisateur?

30
JoeB
this.Page

ou d'à peu près n'importe où:

Page page = HttpContext.Current.Handler as Page
62
Paul Alexander

Je ne vois aucune raison valable pour qu'un contrôle utilisateur connaisse quoi que ce soit sur la page sur laquelle il se trouve car le contrôle utilisateur devrait ignorer son contexte et se comporter de manière prévisible, quelle que soit la page sur laquelle il se trouve. 

Cela étant dit, vous pouvez utiliser this.Page .

14
Andrew Hare

vous pouvez utiliser la propriété Parent

si vous en avez besoin pour trouver un contrôle sur la page, vous pouvez utiliser

Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
7
Josh Mein

J'ai toujours utilisé this.Page dans System.Web.UI.UserControl. 

Ou vous pouvez toujours faire un appel récursif sur le parent jusqu'à ce que vous rencontriez un objet qui est une page.

un peu exagéré cependant ...

protected Page GetParentPage( Control control )
{
    if (this.Parent is Page)
        return (Page)this.Parent;

    return GetParentPage(this.Parent);
}
2
BigBlondeViking

J'ai trouvé le moyen de créer une interface, d'implémenter cette interface, d'utiliser this.Page pour obtenir la page du contrôle, de la convertir en interface, puis d'appeler la méthode.

2
JoeB

Vous devez utiliser NamingContainer comme ça: 

       try
        {
            if (!string.IsNullOrWhiteSpace(TargetCtrlID))
            {
                var ctrl = NamingContainer.FindControl(TargetCtrlID);
                if(ctrl != null)
                    Console.Write("'" + ctrl.ClientID + "'");
            }
        }
        catch
        {

        }
1
Hakan KOSE

Chaque contrôle a une propriété parent que vous pouvez utiliser pour accéder au parent.

protected void Page_Load(object sender, EventArgs e)
{
  Response.Write(this.Parent.ID);
}

EDIT: Dépend de l’un des événements de cycle de vie de la page sur laquelle vous voulez stocker la référence et de l’utilisation de cette sauvegarde. Cependant la référence est toujours disponible 

0
Marco Mangia

Écrire dans une page et une page maître à partir du contrôle de l'utilisateur Web: Personnellement, j'aime bien que les contrôles de l'utilisateur soient lâches, mais cela peut être fait comme ça.

La page principale:

public partial class Second : System.Web.UI.MasterPage
    {
        public void SecondMasterString(string text)
        {
            MasterOut.Text += text;
        }
    }

Directive nécessaire sur WebForm1: afin que la page puisse écrire dans la page maître

<%@  MasterType VirtualPath="~/DemoFolder/MasterPages/Second.master" %>

Les méthodes écrivent à la page et à la page principale:

public partial class WebForm1 : System.Web.UI.Page
    {
    public void SetPageOutput(string text)
        {
            // writes to page
            this.PageOut.Text = text;
        }

        public void SetMaster(string text)
        {
            // writes to Master Page
            this.Master.SecondMasterString(text);
        }
}

Le contrôle utilisateur écrit à la page et à la page principale:

public partial class WebUserControl1 : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LegoLand.DemoFolder.MasterPages.WebForm1 page = (WebForm1)this.Parent.Page;
            page.SetMaster("** From the control to the master");
            page.SetPageOutput("From the control to the page");
        }
    }
0
Stewart

Créez un délégué dans le contrôle utilisateur, puis attribuez-lui une méthode à partir de la page parent.

class MyUserControl : UserControl
{
   delegate object MyDelegate(object arg1, object arg2, object argN);
   public MyDelegate MyPageMethod;

   public void InvokeDelegate(object arg1, object arg2, object argN)
   {
     if(MyDelegate != null)
        MyDelegate(arg1, arg2, argN); //Or you can leave it without the check 
                                      //so it can throw an exception at you.
   }
}

class MyPageUsingControl : Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
     if(!Page.IsPostBack)
        MyUserContorlInstance.MyPageMethod = PageMethod;
   }

   public object PageMethod(object arg1, object arg2, object argN)
   {
     //The actions I want
   }
}
0
Nikolay