Suche…


Syntax

  1. public delegate void ActionClick();

    public event ActionClick OnResetClick;
    

Bemerkungen

Ich habe bei diesem Ansatz keine Nachteile gefunden, aber es gibt einige Dinge, die dies etwas problematisch machen.

  1. Sie müssen für jedes Ereignis einen Ereignishandler hinzufügen. Wenn Sie die Ereignishandler nicht in das OnInit-Ereignis der Seite einfügen, können Sie auf einige Probleme stoßen, die auf Seite zurückgegeben werden, und Sie verlieren die Ereigniszuweisung (da ASP.NET stateless ist, was bei Windows-Steuerelementen nicht der Fall ist) .
  2. Bei diesem Ansatz müssen Sie die Ereignisse des Seitenlebenszyklus berücksichtigen. Wenn Sie an dem Designer arbeiten, kann es vorkommen, dass der Event-Handler ohne Ihre Benachrichtigung verloren geht.
  3. Auch wenn Sie den Ereignishandler nicht hinzugefügt haben, erhalten Sie keine Fehler oder Warnungen. Wenn Sie über mehrere Seiten für die gleiche Aktion verfügen, kann nicht garantiert werden, dass alle Methodennamen gleich sind. Der Entwickler kann seine eigenen Methodennamen auswählen, was die Wartbarkeit des Codes verringert.

Delegierung von Ereignissen von User Control an aspx

Normalerweise entscheiden wir uns für diesen Ansatz, wenn wir eine vollständige Kapselung wünschen und unsere Methoden nicht öffentlich machen wollen.

Ascx

<div style="width: 100%;">
  <asp:Button ID="btnAdd" runat="server" 
    Text="Add" OnClick="btnAdd_Click"></asp:button>
  <asp:button id="btnEdit" runat="server" 
    text="Edit" onclick="btnEdit_Click"> </asp:button>
  <asp:button id="btnDelete" runat="server" 
    text="Delete" onclick="btnDelete_Click">    </asp:Button>
  <asp:button id="btnReset" runat="server" 
    text="Reset" onclick="btnReset_Click"></asp:button>
</div>

Ascx.cs

public delegate void ActionClick();

public partial class EventDelegation : System.Web.UI.UserControl
{
    public event ActionClick OnAddClick;
    public event ActionClick OnDeleteClick;
    public event ActionClick OnEditClick;
    public event ActionClick OnResetClick;
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        if(OnAddClick!= null)
        {
            OnAddClick();
        }
    }

    protected void btnEdit_Click(object sender, EventArgs e)
    {
        if (OnEditClick != null)
        {
            OnEditClick();
        }
    }

    protected void btnDelete_Click(object sender, EventArgs e)
    {
        if(OnDeleteClick!= null)
        {
            OnDeleteClick();
        }
    }

    protected void btnReset_Click(object sender, EventArgs e)
    {
        if(OnResetClick!= null)
        {
            OnResetClick();
        }
    }
}

Das Benutzersteuerelement gibt einige öffentliche Ereignisse wie OnAddClick , OnEditClick usw. an, die einen Delegaten deklarieren. Jeder, der diese Ereignisse verwenden möchte, muss den EventHandler hinzufügen, der ausgeführt wird, wenn das entsprechende Klickereignis der Schaltfläche auftritt.

Aspx Design

<%@ Register src="Controls/EventDelegation.ascx" 
       tagname="EventDelegation" tagprefix="uc1" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <uc1:Direct ID="Direct1" runat="server" />
        </div>
        </form>
    </body>
    </html>

Aspx.cs

public partial class EventDelegation : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        ActionControl.OnAddClick += ActionControl_OnAddClick;
        ActionControl.OnDeleteClick += ActionControl_OnDeleteClick;
        ActionControl.OnEditClick += ActionControl_OnEditClick;
        ActionControl.OnResetClick += ActionControl_OnResetClick;
    }

    private void ActionControl_OnResetClick()
    {
        Response.Write("Reset done.");
    }

    private void ActionControl_OnEditClick()
    {
        Response.Write("Updated.");
    }

    private void ActionControl_OnDeleteClick()
    {
        Response.Write("Deleted.");
    }

    private void ActionControl_OnAddClick()
    {
        Response.Write("Added.");
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow