webentwicklung-frage-antwort-db.com.de

Aufrufen einer Methode in der übergeordneten Seite aus der Benutzersteuerung

Ich habe ein Benutzersteuerelement in einer aspx-Seite registriert Wie rufe ich bei einem Klick auf eine Schaltfläche im Benutzersteuerelement eine Methode auf, die im Codebehind der übergeordneten Seite vorhanden ist?

Vielen Dank.

37
Jeremy Thomson

Hier ist das klassische Beispiel mit Ereignissen, wie von Freddy Rios (C # aus einem Webanwendungsprojekt) vorgeschlagen. Dies setzt voraus, dass Sie einen vorhandenen Delegaten verwenden möchten, anstatt einen eigenen Delegaten zu erstellen, und Sie übergeben keine spezifischen Elemente für die übergeordnete Seite nach Ereignisargumenten.

Im Code-Behind des Benutzersteuerelements (passen Sie es ggf. an, wenn Sie Code-Behind oder C # nicht verwenden):

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
}

Auf der Seite selbst abonnieren Sie die Veranstaltung mit einem der folgenden Informationen:

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
    }

}
110
Stephen M. Redd

Wandeln Sie die Seite als spezifische Seite in Ihrem Projekt um:

((MyPageName)this.Page).CustomMethod()
14
Rex M

Ich schlage vor, dass Sie die Seitenmethode nicht direkt aufrufen, da Sie Ihre Kontrolle an die bestimmte Seite binden würden. 

Setzen Sie stattdessen ein Ereignis aus und lassen Sie es von der Seite abonnieren. Es funktioniert für eine beliebige Anzahl von Seiten und kann einfacher verwendet werden, wenn sich das Steuerelement mehrmals auf einer einzigen Seite befindet (möglicherweise sogar auf einer Liste) und eher mit dem asp.control-Design übereinstimmt.

10
eglasius

Einen guten und angemessenen Ansatz verfolgen, 

Verwenden Sie das Ereignis- und Delegatenkonzept, machen Sie den Delegaten zur gleichen Signatur wie Ihre Methode in der übergeordneten Seite, und weisen Sie ihm im übergeordneten Seitenladeereignis ihm übergeordnetes Verfahren zu. Dann rufen Sie diesen Delegaten über das Ereignis in der Benutzersteuerung auf.

codebeispiel und Link sind unten angegeben. 

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

Weitere Details zur Funktionsweise (Referenz): -

Aufrufen einer Methode der übergeordneten Seite aus der Benutzersteuerung

4
Rohit

Scott Allen hat einen nützlichen Artikel über das Sprudeln von Ereignissen von einem Benutzersteuerelement auf die übergeordnete Seite, in dem die Antwort von Stephen M. Redd erläutert wird:

4
MagicAndi

Ich möchte dieses Szenario machen:

  • Rufen Sie die LoadEditCategory-Methode (übergeordnete Methode) auf.
  • Die übergeordnete Methode (LoadEditCategory) benötigt ein int-Argument (CategoryID).
  • Das untergeordnete Benutzersteuerelement ist RightControlPanel, das sich in demselben übergeordneten Seitenordner befindet.

Child Benutzersteuerung  

1- Fügen Sie eine Action (_LoadEditCategory) hinzu

public Action<int> _LoadEditCategory = null;

<int> ist int Argument (CategoryID).

2- Verwenden Sie diese Action im Schaltflächenereignis (btnSavebutton name) wie folgt:

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

Übergeordnete Seite oder übergeordnete Benutzersteuerung

3- Fügen Sie die übergeordnete Methode hinzu

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

4- Fügen Sie diesen Code hinzu, wenn Sie das untergeordnete Benutzersteuerelement laden (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);

   ...
 }
2
Ali Soltani
 //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 
0
Güven Acar

Ich habe hier etwas veröffentlicht, das funktioniert: Zugriffskontrolle> Seite> Master verschachtelt> Master

Oder wenn Sie auf ein Steuerelement zugreifen möchten, können Sie dies auch tun:

Übergeordnete Seite aktualisieren Wenn die übergeordnete Seite über ein Aktualisierungsfenster mit dem Namen "UpdatePanel1" verfügt

Steuerung

UpdatePanel onParent1 = (UpdatePanel)Parent.FindControl("UpdatePanel1");
onParent1.Update();
0
Stewart

Ich liebe Stephen M. Redds Antwort und musste sie in VB umwandeln. Teilen Sie es hier. Änderungsvorschläge sind willkommen.

Im Code-Behind des Benutzersteuerelements:

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

Abonnieren Sie das Ereignis auf der übergeordneten Seite. Wenn das Ereignis ausgelöst wird, wird Ihr Code hier ausgeführt.

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
0
Taylor Brown