EventArgs包含方法

时间:2015-02-03 13:54:09

标签: c# asp.net events event-handling

我目前正在连接一个用户控件,该用户控件的按钮点击会冒泡到母版页。我已经查看了许多帖子以达到我目前的位置,但我不确定我是否按照正确的方式完成了事情,以及我是否获得了最佳的抽象级别。

我正在使用自定义事件标记,如下所示:

public class JumpEventArgs : EventArgs
{
    readonly int _supplierID;

    public int SupplierID
    {
        get { return _supplierID; }
    }

    public JumpEventArgs(int supplierID)
    {
        supplierID.ThrowDefault("supplierID");

        _supplierID = supplierID;
    }
}

在用户控件中我有这个:

//应该从用户控件中抽象出来吗?

    public event EventHandler<JumpEventArgs> Jumped;

    protected void LinkButtonJump_Click(object sender, EventArgs e)
    {
        var handler = Jumped;

        if (handler != null)
        {
            var args = new JumpEventArgs(ProductID);
            Jumped(this, args);
        }
    }

我的主页面处理程序执行一些跳转事件通用的操作,以及一些对页面显式的操作。我一直在思考如何融入这两者。

这是主页:

    void AddEventHandlers()
    {
        var jumpCtls = this.DeepFind<JumpButton>();
        jumpCtls.ForEach(uc => uc.Jumped += new EventHandler<JumpEventArgs>(JumpCtl_Clicked));
    }

    void JumpCtl_Clicked(object sender, JumpEventArgs e)
    {
        var j = new JumpEvent(e); // this is generic and can be reused
        j.AddTrack();

        MobileSearch.VisitedList.Refresh(); // this is master page only
    }

这是跳跃课程:

//这应该与JumpEventArgs类合并吗?

public class JumpEvent
{
    readonly JumpEventArgs _args;

    public void AddTrack()
    {
        // do something
    }

    public JumpEvent(JumpEventArgs args)
    {
        args.ThrowNull("args");
        _args = args;
    }

    JumpEventArgs Args
    {
        get { return _args; }
    }
}

我不确定是主页面处理程序,它将eventargs传递给泛型类&#34; JumpEvent&#34; - 某些事情看起来不太正确 - 我可能会过度思考它,但最终我不确定。

任何建议表示赞赏。

2 个答案:

答案 0 :(得分:0)

您可以使用普通按钮。看起来你的JumpButton确实做的不仅仅是标准的Button会做的事情,所以它似乎只会增加不必要的复杂性。

<asp:Button id="JumpBtn" OnClick="JumpBtn_Click" CommandArgument="Supplier3" runat="server" Text="Jump!" />

代码背后:

protected void JumpBtn_Click(object sender, EventArgs e)
{
    var supplierId = JumpBtn.CommandArgument; //do something with supplierId
    MobileSearch.VisitedList.Refresh();
}

您可以使用内联数据绑定表达式动态绑定CommandArgument。如果您的JumpBtn应该位于某种控件模板中,您也可以将发件人转换为Button类,例如Repeater

答案 1 :(得分:0)

这并不复杂。

添加按钮到页面

<asp:Button ID="ButtonAction" OnClick="ButtonAction_Click" runat="server">
    Jump!
</asp:Button>

将点击事件传递给您的自定义事件

protected void ButtonAction_Click(object sender, EventArgs e)
{
    if (this.Jumped != null)
    {
        this.Jumped(this, this.ProductId);
    }
}

您的自定义活动

public event EventHandler<int> Jumped;

然后在母版页中使用它

void JumpCtl_Clicked(object sender, int e)
{
    var supplierId = e;
    // Do what you want
}