为什么我可以';t通过页面标记为我的用户控件的事件添加事件处理程序
本文关键字:控件 用户 我的 记为 事件 程序 事件处理 添加 我可以 为什么 | 更新日期: 2023-09-27 18:25:14
我有一个具有公共事件的用户控件。当我在网页中使用这个用户控件,并通过页面标记将事件设置为代码后面的事件处理程序时,我的用户控件的事件不会被设置,即使在第一个页面加载时也总是为null。这是我的用户控件的一部分,其中有一个详细视图,我正试图为它设置事件:
[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);
}
}
这是我的用户控制标记的一部分:
<%@ 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);
}
}
将Add和Remove公开为Public属性。
注意:我刚刚在SO 上看到了这个答案
public event DetailsViewUpdateEventHandler ItemUpdating;
public event DetailsViewUpdateEventHandler OnItemUpdating
{
add { this.ItemUpdating += value;}
remove { this.ItemUpdating -= value;}
}