【问题标题】:ItemCommand of DataList in UpdatePanel is not fired on PostbackUpdatePanel 中 DataList 的 ItemCommand 在回发时未触发
【发布时间】:2015-04-18 02:15:35
【问题描述】:

我有一个弹出面板,其中包含一个 UpdatePanel,其中包含一个 DataList。使用 ItemTemplate 填充表格行,并且在每行上生成一个 LinkBut​​ton 用于删除该行。我想删除 DataList 的 ItemCommand 事件处理程序中的这条记录并重新绑定 DataList。

但是,在我单击 DataList 中的“删除”按钮后,不会触发 ItemCommand。我已经检查了我的 Page_Load 中的 IsPostBack 是否,并且仅在不是回发时才执行 Datalist.Databind() 。通常,我希望在单击 DataList 中的删除按钮后首先调用 Page_Load,然后调用 list_ItemCommand,但未按预期调用 list_ItemCommand。然后,UpdatePanel 内的 DataList 中不会显示任何内容。

陌生人,如果我删除 Page_Load 中的 IsPostBack 检查,也就是说,重新绑定每个 Page_Load 中的 DataList,ItemCommand 将被捕获并调用 list_ItemCommand。这与许多其他帖子中的答案“如果在 PostBack 期间重新绑定 DataList 将取消 ItemCommand 事件”的答案。

后面的代码:

Protected records As New List(Of Record)

Protected Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Set some page properties...
    If Not Page.IsPostBack Then
        GetListOfRecordFromDatabase()
        datalist.DataSource = records
        datalist.DataBind()
    End If
End Sub

Protected Sub datalist_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles datalist.ItemCommand
    Select Case e.CommandName.ToLower
        Case "delete"
            For Each c As Record In records
                If c.Id = e.CommandArgument Then
                    records.Remove(c)
                    Exit For
                End If
            Next
            DeleteRecordFromDatabase(e.CommandArgument)
    datalist.DataSource = records
    datalist.DataBind()
    End Select
End Sub

控件:

<asp:Content ID="content1" runat="server" ContentPlaceHolderID="Content1PlaceHolder">
    <asp:LinkButton ID="btnpopup" runat="server" OnClientClick="javascript:return popup()"></asp:LinkButton>
        <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server" EnableViewState="false" >
        </asp:ScriptManagerProxy>

        <asp:Panel ID="PanelPopup" runat="server" style="display:none;">

            <asp:UpdatePanel ID="UPPopup"  runat="server"  UpdateMode="conditional" EnableViewState="false">
                <ContentTemplate>
                <div id="divPopup1" runat="server">

                    <table id="table1" cellpadding="2" cellspacing="1" width="500" border="0" >
                        <asp:DataList ID="datalist" runat="server" OnItemCommand="datalist_ItemCommand">
                        <ItemTemplate>
                            <tr align="center">
                            <td><%#Container.ItemIndex +1 %></td>
                            <td><asp:Label ID="Label1" runat="server" Text='<%# eval("Name") %>'></asp:Label></td> 
                            <td><asp:Label ID="Label2" runat="server" Text='<%# eval("Color") %>'></asp:Label></td> 
                            <td><asp:LinkButton ID="Delete" CommandName="Delete" runat="server" Text="Delete" CommandArgument='<%# eval("Id") %>' ></asp:LinkButton></td>
                            </tr>
                        </ItemTemplate>
                        </asp:DataList>
                    </table> 
                </div>
                </ContentTemplate>
            </asp:UpdatePanel>
            <div style="text-align:center;"><br />
                <asp:Button ID="BtnSavePopup" runat="server" Text="Save and Close"/> 
            </div>                   
        </asp:Panel>

    <script type="text/javascript">
        function popup() {
            return mypagehelper.openAsModalPopup("<% =PanelPopup.ClientID%>");
        }
    </script>
</asp:Content>

此外,我尝试使用以下代码获取 ControlID 和在回发期间引发事件的控件:

If IsPostBack Then
  Dim CtrlID As String = String.Empty
  If Request.Form("__EVENTTARGET") IsNot Nothing And
     Request.Form("__EVENTTARGET") <> String.Empty Then
     CtrlID = Request.Form("__EVENTTARGET")
     Dim postbackControl As System.Web.UI.Control = Page.FindControl(CtrlID)
  Else      
End If

我发现我可以将我的 CtrlID 设为“ctl00$datalist$ctl08$Delete”,但 postbackControl 什么都没有。在我的其他正常页面上,我可以获得引发事件的 controlID 和实际控件(即 LinkBut​​ton)。

【问题讨论】:

  • 尝试将&lt;Triggers&gt; &lt;asp:AsyncPostBackTrigger ControlID="datalist" EventName="ItemCommand" /&gt; &lt;/Triggers&gt;添加到更新面板
  • @SherifAhmed 刚试过,不工作
  • 尝试添加 ChildrenAsTriggers="true" 来更新面板
  • @Sandeep 也试过了,没用 :(

标签: asp.net event-handling postback


【解决方案1】:

从更新面板中移除 EnableViewState="false"。

【讨论】:

    【解决方案2】:

    这是迟到的答案,但我很快就会遇到,也可能会帮助其他人...... CommandName="Delete" 为 DataList "OnItemDeleting" 事件保留 因此,只需将 CommandName 更改为其他任何内容(例如 "Remove")将有助于或处理 OnItemDeleting 事件。

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多