2009-06-22 2 views

Répondre

55
this.Page 

ou d'un peu partout:

Page page = HttpContext.Current.Handler as Page 
7

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"); 
11

Je ne peux pas penser à une bonne raison pour un contrôle de l'utilisateur de savoir quoi que ce soit sur la page, car le contrôle de l'utilisateur devrait être ignorants de son contexte et se comportent de manière prévisible quelle que soit la page sur laquelle il se trouve.

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

+0

c'est un bon point. Les contrôles utilisateur bien définis doivent être complètement indépendants de la page sur laquelle ils se trouvent. – jtate

+4

Si l'application en question est une application silo et que toutes les pages héritent d'une classe BasePage et que vous devez accéder à cette BasePage, this.Page est une solution complètement acceptable car toutes les pages de cette application hériteront de cette BasePage et du Contrôle. sera défini uniquement pour cette application. – cavillac

+1

Un bon exemple d'utilisation est d'accéder à la collection Page.Items, qui peut être utilisée pour stocker des objets utilisés pour la durée de vie du cycle de traitement des pages Asp.net. Vous pouvez éviter de recharger des objets communs dans chaque contrôle utilisateur. – humbads

0

Chaque contrôle possède 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 laquelle l'un des événements du cycle de vie de la page que vous souhaitez stocker la référence et quelle utilisation pour stocker cette référence. Cependant la référence est toujours disponible

2

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

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

genre d'surpuissant mais ...

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

    return GetParentPage(this.Parent); 
} 
+0

Cela peut provoquer 'StackOverFlowException' ... – Moumit

2

J'ai trouvé la façon de le faire est de créer une interface, mettre en œuvre cette interface, utilisez this.Page pour obtenir la page de la commande, le jeter aux l'interface, puis appelez la méthode.

1

Vous devez utiliser NamingContainer comme ça:

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

     } 
0

Créer un délégué dans le contrôle de l'utilisateur, puis lui attribuer 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 
    } 
} 
Questions connexes