サーチ…


構文

  1. public delegate void ActionClick();

    public event ActionClick OnResetClick;
    

備考

私はこのアプローチでは何の不都合も見つけられませんでしたが、これを少し問題にするいくつかのことがあります。

  1. イベントごとにイベントハンドラを追加する必要があります。ページのOnInitイベントにイベントハンドラを追加しないと、ページポストバックでイベントの割り当てが失われるという問題が発生する可能性があります(ASP.NETはステートレスなので、Windowsコントロールではそうではありません) 。
  2. このアプローチでは、ページライフサイクルイベントを尊重する必要があります。デザイナーで作業しているときに、イベントハンドラが通知なく失われることがあります。
  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();
        }
    }
}

ユーザーコントロールは、のようないくつかの公共のイベントを指定OnAddClickOnEditClickデリゲートを宣言、など。、。これらのイベントを使用する場合は、対応するボタンクリックイベントが発生したときに実行する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