【问题标题】:ASP.NET ImageButton Onclick Event not handledASP.NET ImageButton Onclick 事件未处理
【发布时间】:2009-10-20 15:44:00
【问题描述】:

我在 GridView 中有一个 ImageButton。

<asp:GridView ID="ItemGridView" runat="server" DataKeyNames="Id" 
     OnRowDataBound="ItemGridView_RowDataBound" AllowPaging="True" 
     AllowSorting="True" EnableSortingAndPagingCallbacks="True" 
     AutoGenerateEditButton="False" AutoGenerateDeleteButton="false"
     DataSourceID="ItemDataSource" EnableViewState="true" >
    ....
    <asp:TemplateField ShowHeader="False" ItemStyle-Width="40px">
      <ItemTemplate>
         <asp:ImageButton ID="btnDelete" SkinID="btnDelete"
            runat="server" CausesValidation="false"
            OnClick="btnDeleteAccountItem_Click" 
            OnClientClick="javascript:return confirm('Are you sure?');" />
       </ItemTemplate>
    </asp:TemplateField>

以及删除按钮事件的相应处理程序

protected void btnDeleteAccountItem_Click(object sender, EventArgs e) {
    ImageButton btnDel = sender as ImageButton;
    GridViewRow row = (GridViewRow)btnDel.NamingContainer;
    ....
}

我在很多地方都使用了同样的结构,而且效果很好。不过,我现在有一个 gridview,但它没有,我希望获得一些关于如何追踪问题的想法。 当我单击按钮时,客户端事件触发并显示警告框,然后回发触发,我可以在Page_Load 方法中打断点。所以按钮事件的客户端连接似乎有效。但是,该事件没有被处理,并且 btnDeleteAccountItem_Click 方法没有被调用。

这是一个复杂的页面,我无法发布所有代码。我可以做些什么来缩小潜在原因的范围?

【问题讨论】:

  • 您是否检查过 Page_Load 中的任何信息,例如 IsPostBack 是否为 true 或表单集合中的 EVENTTARGET 值?
  • IsPostBack 为 true,并且表单集合似乎为空。这是什么意思?
  • 我应该补充一点,GridView 在 MultiView 控件上,并且 form 标记在母版页中。
  • 见下文 - EVENTTARGET 现在似乎具有正确的值,但仍然没有调用处理程序。

标签: c# asp.net event-handling


【解决方案1】:

您的事件定义不正确ImageButton.Click

protected void btnDeleteAccountItem_Click(object sender, ImageClickEventArgs e) {
    ImageButton btnDel = sender as ImageButton;
    GridViewRow row = (GridViewRow)btnDel.NamingContainer;
    ....
}

【讨论】:

  • 你是对的,但就像我说的那样,代码在其他页面上工作正常,更改事件参数类型并不能解决问题。页面上一定有其他东西破坏了这一点。
  • 您的 OnClientClick 是否在做除了确认之外的任何操作?
  • 如果从标记中完全删除 OnClientClick 会发生什么?
  • 这些都没有意义,所以我会问这个问题。 Page_Load 将首先触发,然后是您的事件,您是否在页面生命周期中进行了足够多的调试以获取您的事件?
  • 是的,我有一个没有被击中的断点。不过,我认为它必须与在网格上调用 Databind() 相关。我有一个用于编辑项目的弹出窗口。我在 IFrame 中使用 Shadowbox,所以它加载到一个单独的页面中,如果发生变化,我不会回复,所以我只是无条件地在网格上调用 Databind。看来我不能这样做。感谢您的帮助!
【解决方案2】:

我不确定这是否能解决问题,但是一旦我在我的标记中放置了一个 asp:Button 控件并为其生成了“onClick”签名。

然后我改变了主意,决定把它变成一个图像按钮……我只是自己重写了标签。

进行这些更改后,我意识到 onClick 签名不再起作用...经过一些研究,我找到了答案...我使用的是“EventArgs”而不是“ImageClickEventArgs”...

(object sender, ImageClickEventArgs e)

一旦我更改了事件 arg 对象,它就开始正常工作了。

【讨论】:

  • 取得一些进展 - 修复事件参数后,EVENTTARGET 值现在在表单集合中,它是问题中的图像按钮。
【解决方案3】:

您可以使用数据网格行命令事件,而不是创建按钮单击事件

然后您可以使用 e.commandName 和 e.commandArgument 找出按下了哪个按钮以及它的参数是什么:

 Private Sub gv1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gv1.RowCommand
    If e.CommandName = "Whatever" Then
       // do something
     End If

希望对你有帮助

【讨论】:

    【解决方案4】:

    确保 CausesValidation 设置为 True。

    【讨论】:

      【解决方案5】:

      你可以试试(你正在创建ImageButton的错误点击事件):

      <asp:TemplateField ShowHeader="False" ItemStyle-Width="40px">
       <ItemTemplate>
        <asp:ImageButton ID="btnDelete" SkinID="btnDelete" runat="server"
         CausesValidation="false" OnClick="btnDeleteAccountItem_Click"
         OnClientClick="javascript:return confirm('Are you sure?');" />
       </ItemTemplate>
      </asp:TemplateField>
      

      对于图片按钮,点击事件有如下变化:

      protected void btnDelete_Click(object sender, ImageClickEventArgs e)
      {
       ImageButton btnDel = sender as ImageButton;
       GridViewRow row = (GridViewRow)btnDel.NamingContainer;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-05
        • 2011-12-15
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        相关资源
        最近更新 更多