2009-06-22 7 views

Odpowiedz

55
this.Page 

lub po prostu wszędzie:

Page page = HttpContext.Current.Handler as Page 
7

można użyć właściwości Parent

jeśli trzeba to znaleźć kontrolę na stronie można użyć

Label lbl_Test = (Label)Parent.FindControl("lbl_Test"); 
11

Nie mogę wymyślić żadnego powodu, dla którego kontrola użytkownika mogłaby wiedzieć cokolwiek o stronie, na której się znajduje, ponieważ kontrola użytkownika powinna być ignorować jego kontekst i zachowywać się w sposób przewidywalny niezależnie od strony, na której się znajduje.

W związku z tym można użyć this.Page.

+0

to świetny punkt. dobrze zdefiniowane elementy sterowania użytkownika powinny być całkowicie niezależne od strony, na której się znajdują. – jtate

+4

Jeśli dana aplikacja jest aplikacją silo i wszystkie strony dziedziczą z klasy BasePage i musisz uzyskać dostęp do BasePage, to ta strona jest całkowicie akceptowalnym rozwiązaniem, ponieważ wszystkie strony w tej aplikacji odziedziczą po tej stronie Base i kontroli. zostaną zdefiniowane wyłącznie dla tego wniosku. – cavillac

+1

Dobrym przykładem jest to, aby uzyskać dostęp do kolekcji Page.Items, która może być używana do przechowywania obiektów używanych przez cały cykl przetwarzania stron Asp.net. Możesz uniknąć ponownego ładowania wspólnych obiektów w każdym kontrolerze użytkownika. – humbads

0

Każdy element sterujący ma właściwość nadrzędną, której można użyć do uzyskania dostępu do obiektu nadrzędnego.

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

EDIT: zależy na którym jednym z wydarzeń cyklu życia strony, którą chcesz zapisać odwołanie i po co, żeby zachować odniesienie. Jednak odniesienie jest zawsze dostępne:

2

Zawsze używałem tej strony w System.Web.UI.UserControl.

Albo zawsze możesz wykonać rekursywne połączenie z rodzicem, aż napotkasz obiekt będący stroną.

rodzaju przesada chociaż ...

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

    return GetParentPage(this.Parent); 
} 
+0

Może to spowodować 'StackOverFlowException' ... – Moumit

2

Znalazłem sposób to zrobić jest stworzenie interfejsu, wdrożenia tego interfejsu, należy this.Page aby uzyskać stronę z kontrolą, miotać interfejsu, a następnie wywołaj metodę.

1

Musisz użyć NamingContainer tak:

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

     } 
0

Tworzenie delegata w kontroli użytkownika, a następnie przypisać mu metodę od strony nadrzędnej.

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 
    } 
} 
Powiązane problemy