2009-03-08 10 views

Odpowiedz

11

Obsada strona jako konkretnej strony w projekcie:

((MyPageName)this.Page).CustomMethod() 
+2

To zadziała, ale to zły pomysł. Łamie kilka wytycznych projektowych i najlepszych praktyk. –

+4

@Henk oczywiście łamie najlepsze praktyki, ale jeśli pytający nie rozumie czegoś prostego, jak to działa, jak będzie w stanie zrozumieć większe rzeczy później. Zawsze najlepiej używać najpierw najprostszy sposób, nawet jeśli jest on zły, tylko po to, aby się uczyć. –

+2

Wiem, ale do przyszłego czytania i do lektury uważam, że najlepiej jest przynajmniej o tym wspomnieć. –

9

Proponuję nie wywołać metodę strony bezpośrednio, jak można byłoby wiążąc swoją kontrolę do konkretnej strony.

Zamiast tego wystawiaj wydarzenie i zaprenumeruj stronę. Działa na dowolnej liczbie stron, można go łatwiej użyć, gdy formant jest kilka razy na jednej stronie (może nawet na liście) i jest bardziej zgodny z projektem asp.control.

+1

Wzorzec obserwatora – NeedHack

101

Oto klasyczny przykład wykorzystania zdarzeń sugerowanych przez Freddy'ego Riosa (C# z projektu aplikacji internetowej). Zakłada się, że chcesz użyć istniejącego delegata zamiast tworzyć własne i nie przekazujesz niczego specyficznego dla strony nadrzędnej za pomocą argumentów zdarzeń.

w kontroli użytkownika kodu źródłowego (przystosować jako konieczny, jeśli nie przy użyciu kodu źródłowego lub C#):

public partial class MyUserControl : System.Web.UI.UserControl 
{ 
    public event EventHandler UserControlButtonClicked; 

    private void OnUserControlButtonClick() 
    { 
     if (UserControlButtonClicked != null) 
     { 
      UserControlButtonClicked(this, EventArgs.Empty); 
     } 
    } 

    protected void TheButton_Click(object sender, EventArgs e) 
    { 
     // .... do stuff then fire off the event 
     OnUserControlButtonClick(); 
    } 

    // .... other code for the user control beyond this point 
} 

W samym zapisać się do wydarzenia z czymś takim stronie:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // hook up event handler for exposed user control event 
     MyUserControl.UserControlButtonClicked += new 
        EventHandler(MyUserControl_UserControlButtonClicked); 
    } 
    private void MyUserControl_UserControlButtonClicked(object sender, EventArgs e) 
    { 
     // ... do something when event is fired 
    } 

} 
+1

Stephen, pomocna i zwięzła odpowiedź. +1. – MagicAndi

+3

Chciałbym dać ci +2 :) – suhendri

+0

dziękuję .. zadziałało dobrze – msbyuva

-8

Można użyć Session. Powiedzieć po kliknięciu na przycisk pod kontrolą użytkownika, a gdy chcesz wywołać metodę strony nadrzędnej następnie w obsługi zdarzeń przycisku wartości kliknij polecenie Ustaw jako

Session["CallParent"]="someValue"; 

jak przycisk będzie zakładać z powrotem na stronę. Na Page_Load zdarzenie nadrzędnej dodać

protected void Page_Load(object sender,EventArgs e) 
{ 
    if(Session["CallParent"]!=null) 
    { 
     // here call the Parent Page method 
     Method1(); 
     // now make the session value null 
    Session["CallParent"]=null; 
    } 
} 

Jest o wiele bardziej wydajny

4

Śledź dobrego i odpowiedniego podejścia,

Wykorzystanie zdarzeń i delegat koncepcja uczynić delegata jako sam podpis jako metodę na stronie nadrzędnej a następnie przypisz rodzicowi metadane do zdarzenia ładowania strony nadrzędnej, a następnie wywołaj tego delegata poprzez zdarzenie w kontroli użytkownika.

kod przykładowy i link znajduje się poniżej.

//Parent Page aspx.cs part 

public partial class getproductdetails : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    ucPrompt.checkIfExist += new uc_prompt.customHandler(MyParentMethod); 
    } 

    bool MyParentMethod(object sender) 
    { 
    //Do Work 
    } 
} 

//User control parts 
public partial class uc_prompt : System.Web.UI.UserControl 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 
} 

public delegate bool customHandler(object sender); 
public event customHandler checkIfExist; 
protected void btnYes_Click(object sender, EventArgs e) 
{ 
    checkIfExist(sender); 
} 
} 

Więcej szczegółów, jak to działa (odniesienia): -

Calling a method of parent page from user control

0
//c# 
//In parent page 
public void test(string S) 
{ 
    Label1.Text = S; 
    } 

//In user control 
protected void Button1_Click(object sender, System.EventArgs e) 
{ 
//Calling "test method" of parent page from user control 
((object)this.Page).test("Hello!!"); 
} 

'VB.Net 
'In parent page 
Sub test(ByVal S As String) 
    Label1.Text = S 
End Sub 

'In user control 
    Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click 
    'Calling "test method" of parent page from user control 
    DirectCast(Me.Page, Object).test("Hello!!") 
    End Sub 
2

chcę zrobić ten scenariusz:

  • połączeń LoadEditCategory metoda (metoda macierzysta).
  • Metoda macierzysta (LoadEditCategory) wymaga argumentu int() (CategoryID).
  • Kontrola użytkownika podrzędnego to RightControlPanel w tym samym folderze stron nadrzędnych.

Child Control User

1- Dodaj Action (_LoadEditCategory)

public Action<int> _LoadEditCategory = null;

<int> jest int argument (CategoryID).

2- Służy Action w przypadku przycisków (btnSave nazwa przycisku), jak to:

void btnSave_Click(object sender, EventArgs e) 
{ 
    //123 is test integer for CategoryID 
    _LoadEditCategory(123);   
} 

strony nadrzędnej kontroli użytkownika lub rodziców

3- metoda dodawania dominująca

private void LoadEditCategory(int CategoryID) 
    { 
    // CategoryID is 123 in my example 
    //Do some things with CategoryID 
    } 

4- Dodaj ten kod po załadowaniu kontroli użytkownika podrzędnego (RightControlPanel)

//Load child user control 
RightControlPanel si = this.LoadControl(this.ControlPath + "RightControlPanel.ascx") as RightControlPanel; 
if (si != null) 
{ 
    ... 

    //For call parent method in child user control 
    si._LoadEditCategory = c => LoadEditCategory(c); 

    ... 
} 
0

Uwielbiam odpowiedź Stephena M. Redda i musiałem ją przekonwertować na VB. Udostępniam to tutaj. Sugerowane zmiany są mile widziane.

w kontroli użytkownika kodu źródłowego:

Public Class MyUserControl 
    Inherits System.Web.UI.UserControl 

    'expose the event publicly 
    Public Event UserControlButtonClicked As EventHandler 

    'a method to raise the publicly exposed event 
    Private Sub OnUserControlButtonClick() 

     RaiseEvent UserControlButtonClicked(Me, EventArgs.Empty) 

    End Sub 

    Protected Sub lbtnApplyChanges_Click(sender As Object, e As EventArgs) Handles lbtnApplyChanges.Click 

     'add code to run here, then extend this code by firing off this event 
     'so it will trigger the public event handler from the parent page, 
     'and the parent page can hanlde it 

     OnUserControlButtonClick() 

    End Sub 

End Class 

Na stronie macierzystej subskrybować zdarzenia, więc gdy zdarzenie jest wywoływane, Twój kod będzie działał tutaj.

Public Class SalesRecord 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     'hook up event handler for exposed user control event to handle this 
     AddHandler MyUserControl.UserControlButtonClicked, AddressOf MyUserControl_UserControlButtonClicked 

    End Sub 

    ''' <summary> 
    ''' code to run when user clicks 'lbtnApplyChanges' on the user control 
    ''' </summary> 

    Private Sub MyUserControl_UserControlButtonClicked() 

     'this code will now fire when lbtnApplyChanges_Click executes 

    End Sub 

End Class 
Powiązane problemy