为什么我不能通过页面标记为我的usercontrol事件添加事件处理程序

时间:2012-02-20 09:53:35

标签: c# asp.net events user-controls

我有一个具有公共事件的usercontrol。当我在我的网页中使用此用户控件并通过页面标记将事件设置为我的代码中的事件处理程序时,我的usercontrol事件不会被设置,即使在第一页加载时也始终为null。这是我的usercontrol的一部分,其中有一个详细信息视图,我正在尝试设置事件:

[Serializable(), PersistChildren(false)]
public partial class UserControl_UCDetailsView : System.Web.UI.UserControl
{
    //here is an event for exposing detailsview1 event to the outside code
    public event DetailsViewUpdateEventHandler OnItemUpdating;
    protected void detailsview1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
    {
        //here i want it not to be null but it is. by using break points i found out 
        //this is always null and never actually get set while i've set it in markup!
        if (this.OnItemUpdating != null)
            this.OnItemUpdating(sender, e);
    }
}

这是 usercontrol 标记的一部分:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UCDetailsView.ascx.cs"
    Inherits="UserControl_UCDetailsView" %>
<asp:DetailsView ID="detailsview1" runat="server" OnItemUpdating="detailsview1_ItemUpdating">
</asp:DetailsView>

这就是我在页面标记中设置事件的方式:

<UC:DetailsView ID="ucDetails" runat="server" OnItemUpdating="ucDetails_ItemUpdating">
</UC:DetailsView>

在ucDetails_ItemUpdaing中我有一个真正的更新逻辑,比如设置字段等。 那么,为什么如果我在页面加载时设置事件,如下所示问题得到解决?我错过了什么?一个属性可能吗?

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ucDetails.OnItemUpdating += new DetailsViewUpdateEventHandler(ucDetails_ItemUpdating);
    }
}

1 个答案:

答案 0 :(得分:2)

公开Add and Remove as Public属性。

注意:I've just seen this answer on SO

public event DetailsViewUpdateEventHandler ItemUpdating; 

public event DetailsViewUpdateEventHandler OnItemUpdating
{ 
   add { this.ItemUpdating += value;} 
   remove { this.ItemUpdating -= value;} 
}