UpdatePanel中DataList的ItemCommand未在Postback上激发



我有一个弹出面板,其中包含UpdatePanel,其中包含DataList。表行是使用ItemTemplate填充的,每行都会生成一个用于删除此行的LinkButton。我想在DataList的ItemCommand事件处理程序中删除此记录,并重新绑定DataList。

但是,在单击DataList中的"删除"按钮后,ItemCommand不会被激发。我已经在Page_Load中检查了IsPostBack,如果它不是回发,只执行Datalist.Databind()。通常情况下,我希望在单击DataList中的删除按钮后,首先调用Page_Load,然后调用list_ItemCommand,但list_ItemCommand并没有按预期调用。然后在UpdatePanel内部的DataList中什么也不显示。

更奇怪的是,如果我删除Page_Load中的IsPostBack检查,也就是说,在每个Page_Loads中重新绑定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和在Postback期间引发事件的控件:

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为Nothing。在我的其他普通页面上,我可以获得引发事件的controlID和实际控件(即LinkButton)。

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

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

相关内容

  • 没有找到相关文章

最新更新