2009-03-08 15 views

risposta

11

Fusioni pagina come pagina specifica nel progetto:

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

Questo funzionerà ma è una cattiva idea. Rompe diverse linee guida di progettazione e best practice. –

+4

@Henk ovviamente rompe le best practice, ma se il richiedente non capisce qualcosa di semplice come funziona, come sarà in grado di capire cose più grandi in seguito. È sempre meglio usare prima il modo più semplice, anche se è sbagliato, solo per imparare. –

+2

Lo so, ma per i futuri riferimenti e inciampi nei lettori penso che sia sempre meglio almeno menzionarlo. –

9

io suggerisco di non chiamare il metodo pagina direttamente, come si sarebbe legando il vostro controllo alla pagina specifica.

Invece esporre un evento e iscriversi alla pagina. Funziona per qualsiasi numero di pagine, può essere più facilmente utilizzato quando il controllo è più volte su una singola pagina (forse anche su una lista) ed è più in linea con il design di asp.control.

+1

Modello di osservatore – NeedHack

101

Ecco l'esempio classico che utilizza gli eventi come suggerito da Freddy Rios (C# da un progetto di applicazione Web). Ciò presuppone che si voglia utilizzare un delegato esistente piuttosto che crearne uno proprio e che non si passi nulla di specifico alla pagina padre per argomenti di evento.

Negli anni code-behind controllo utente (adattare, se necessario, se non si utilizza code-behind o 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 
} 

Nella pagina stessa si sottoscrive l'evento con qualcosa di simile:

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, una risposta utile e concisa. +1. – MagicAndi

+3

vorrei poterti dare +2 :) – suhendri

+0

grazie .. ha funzionato perfettamente – msbyuva

-8

È possibile utilizzare Session. Diciamo che quando si fa clic su un pulsante nel controllo utente e quando si desidera chiamare il metodo pagina Parent poi nel gestore di eventi del pulsante di valore clic su Imposta come

Session["CallParent"]="someValue"; 

come pulsante post indietro alla pagina. Su Page_Load caso di pagina padre inserirlo

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; 
    } 
} 

E 'molto più efficiente

4

Seguire buone e appropriate approccio,

Usa dell'evento e delegato concetto di fare delegato come stessa firma come metodo nella pagina padre e quindi assegnare il metad del genitore ad esso nell'evento di caricamento della pagina padre, quindi chiamare questo delegato attraverso l'evento nel controllo utente.

codice di esempio e collegamento è indicato di seguito.

//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); 
} 
} 

Ulteriori dettagli come funziona (riferimento): -

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

che voglio fare questo scenario:

  • chiamata LoadEditCategory metodo (metodo genitore).
  • Il metodo padre (LoadEditCategory) richiede un argomento int (CategoryID).
  • Il controllo utente figlio è RightControlPanel che si trova nella stessa cartella della pagina principale.

controllo figlio utente

1- Aggiungere un Action (_LoadEditCategory)

public Action<int> _LoadEditCategory = null;

<int> è int argomento (CategoryID).

2- Utilizzare questo Action nell'evento pulsante (btnSave nome del pulsante) come questo:

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

pagina padre o controllo utente genitore

3- metodo Add genitore

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

4- Aggiungere questo codice quando si carica il controllo utente secondario (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

Amo la risposta di Stephen M. Redd e ho dovuto convertirlo in VB. Condividendolo qui. Le modifiche consigliate sono benvenute.

Nel controllo utente code-behind:

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 

Nella pagina padre sottoscrivere l'evento, in modo che quando l'evento viene generato, il codice verrà eseguito qui.

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 
Problemi correlati