수색…


통사론

  1. public delegate void ActionClick();

    public event ActionClick OnResetClick;
    

비고

이 접근법에서 어떤 단점도 발견하지 못했지만 약간 문제가있는 몇 가지 사항이 있습니다.

  1. 각각의 이벤트마다 이벤트 핸들러를 추가해야합니다. 페이지의 OnInit 이벤트에 이벤트 처리기를 추가하지 않으면 페이지 포스트 백에서 이벤트 할당을 잃을 수있는 몇 가지 문제가 발생할 수 있습니다 (ASP.NET은 무국적이며 Windows 컨트롤에서는 그렇지 않습니다) .
  2. 이 접근 방식에서는 페이지 수명주기 이벤트를 존중해야합니다. Designer에서 작업 할 때 어떤 경우에는 이벤트 처리기가 예고없이 손실 될 수 있습니다.
  3. 이벤트 처리기를 추가하지 않은 경우에도 오류나 경고가 발생하지 않습니다. 동일한 작업을 수행하는 페이지가 여러 개있는 경우 모든 메소드 이름이 동일하다는 보장은 없습니다. 개발자는 자신의 메서드 이름을 선택할 수 있으므로 코드의 유지 관리가 쉽지 않습니다.

사용자 컨트롤에서 aspx로 이벤트 위임

일반적으로 우리는 완전한 캡슐화를 원하고 우리의 메소드를 public으로 만들고 싶지 않다면이 접근법을 선택한다.

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

사용자 정의 컨트롤은 OnAddClick , OnEditClick 등과 같은 일부 공개 이벤트를 지정 OnAddClick ,이 이벤트는 대리자를 선언합니다. 이러한 이벤트를 사용하려는 사용자는 해당 버튼 클릭 이벤트가 발생할 때 실행할 EventHandler를 추가해야합니다.

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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow