Szukaj…


Składnia

  1. public delegate void ActionClick();

    public event ActionClick OnResetClick;
    

Uwagi

Nie znalazłem żadnych wad tego podejścia, ale jest kilka rzeczy, które sprawiają, że jest to trochę problematyczne.

  1. Musisz dodać moduł obsługi zdarzeń dla każdego zdarzenia. Jeśli nie dodasz procedur obsługi zdarzeń w zdarzeniu OnInit strony, możesz napotkać pewne problemy, które po odesłaniu strony utracą przypisanie zdarzenia (ponieważ ASP.NET jest bezstanowy, co nie ma miejsca w przypadku kontrolek Windows) .
  2. W tym podejściu należy szanować zdarzenia cyklu życia strony. Czasami podczas pracy z Projektantem może się zdarzyć, że moduł obsługi zdarzeń zginie bez powiadomienia.
  3. Nawet jeśli nie dodałeś modułu obsługi zdarzeń, nie otrzymasz żadnych błędów ani ostrzeżeń. Jeśli masz wiele stron do wykonania tej samej akcji, nie ma gwarancji, że wszystkie nazwy metod będą takie same; deweloper może wybrać własne nazwy metod, co zmniejsza łatwość konserwacji kodu.

Delegowanie zdarzenia z kontroli użytkownika do aspx

Zwykle wybieramy to podejście, jeśli chcemy pełnej enkapsulacji i nie chcemy upubliczniać naszych metod.

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

Kontrola użytkownika określa niektóre zdarzenia publiczne, takie jak OnAddClick , OnEditClick itp., Które deklarują delegata. Każdy, kto chce korzystać z tych zdarzeń, musi dodać moduł obsługi zdarzeń, aby wykonać go, gdy wystąpi odpowiednie zdarzenie kliknięcia przycisku.

Projekt Aspx

<%@ 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow