c#为什么我的页面/用户控件只支持一个事件处理程序

时间:2013-05-23 09:53:21

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

我有2个事件要从用户控件触发回到它的父节点。 “UserSelected”和“NoUsersSelected”

一个用户被选中时会触发,另一个用户被删除后会触发另一个用户。

我的问题是“UserSelected”有效,但是“NoUsersSelected”失败了...在下面的代码片段中,我评论了失败的行。

更新 当我评论与第一个事件处理程序相关的所有代码时,第二个事件开始工作。

以下是我的孩子(用户)控件上的代码:

    public event EventHandler UserSelected;
    public event EventHandler NoUsersSelected;

    protected virtual void onUserSelected(System.EventArgs e)
        {
            if (UserSelected != null) UserSelected(this, e);
        }

    protected virtual void onNoUsersSelected(System.EventArgs e)
        {

**###** PROBLEM ! - NoUsersSelected is always null so doesn't fire event **###**
            if (NoUsersSelected != null) NoUsersSelected(this, e);
        }

为了提升事件,我在GridView TemplateField中使用按钮:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Button ID="btnSelect" CommandArgument='<%# Eval("UserID") %>' CommandName="SelectUser" ToolTip="Select User" runat="server" UseSubmitBehavior="false" CssClass="GridBtn_Select" CausesValidation="false" />
    </ItemTemplate>
</asp:TemplateField>

<asp:TemplateField>
    <ItemTemplate>
        <asp:Button ID="btnDelete" CommandArgument='<%# Eval("UserID") %>' CommandName="DeleteUser" ToolTip="Delete User" runat="server" OnClientClick="javascript:if(!confirm('Are you sure?')) return false;" UseSubmitBehavior="false" CssClass="GridBtn_Delete" CausesValidation="false" />
    </ItemTemplate>
</asp:TemplateField>

以下是这些按钮背后的代码:

if (e.CommandName == "SelectUser")
        {onUserSelected(System.EventArgs.Empty);}

和...

if (e.CommandName == "DeleteUser")
        { //this is where I remove the user from the grid...

            if (gridUsers.Rows.Count < 1)
                {onNoUsersSelected(System.EventArgs.Empty);}

在托管用户控件的父页面上:

protected void Page_Load(object sender, EventArgs e)
        {
            //Bind to the event on child control
            GridAdvertiserUsers.UserSelected += UserSelected_EventHandler;
            GridAdvertiserUsers.NoUsersSelected += NoUsersLinked_EventHandler;
}

以及事件调用的函数:

  void UserSelected_EventHandler(object sender, EventArgs e)
        { //do stuff here }

  void NoUsersLinked_EventHandler(object sender, EventArgs e)
        { //Do other stuff }

更新

当调用onUserSelected时,两个事件似乎都正确连接了它们的方法  When onUserSelected is called, both Events seem to have their methods wired up correctly

但是当调用onNoUserSelected时,它们都是null: when onNoUserSelected is called, they are both null

1 个答案:

答案 0 :(得分:1)

这一行:

       GridAdvertiserUsers.NoUsersSelected += NoUsersLinked_EventHandler;

应确保此评论为false:

       **###** PROBLEM ! - NoUsersSelected is always null so doesn't fire event **###**
       if (NoUsersSelected != null) NoUsersSelected(this, e);

但是当你以不同的方式体验它时,执行这两行时必定存在问题。使用跟踪和/或调试来查找。


       int thisPage = this.GethashCode();   // view in Debugger and make a note
       GridAdvertiserUsers.NoUsersSelected += NoUsersLinked_EventHandler;

       ....

       int thisPage = this.GethashCode();   // view in Debugger, should be the same id
       if (NoUsersSelected != null) NoUsersSelected(this, e);