RadListView ItemCommand not firing
本文关键字:firing not ItemCommand RadListView | 更新日期: 2023-09-27 18:10:26
我有一个RadListView和一个事件处理程序绑定到lstGameWaypoints_ItemCommand如下所示。在第一次显示网格时,单击删除按钮成功地触发回发并触发ItemCommand。
回发完成后,事件处理程序似乎没有再次连接,并且单击delete按钮不会发生任何操作。
有人见过类似的问题吗?
<telerik:RadListView runat="server" ID="RadListView1"
DataSourceID="ObjectDataSource1" AllowPaging="true"
OnDataBound="lstGameWaypoints_DataBound"
OnItemCreated="lstGameWaypoints_ItemCreated"
OnItemCommand="lstGameWaypoints_ItemCommand">
<EmptyDataTemplate>
<div style="width: 100px;margin: 10px auto auto auto;"><button class="AddWaypoint">Add Waypoint</button></div>
</EmptyDataTemplate>
<ItemTemplate>
<td>
<table style="border:1px solid black;width: 232px;height: 70px;margin:auto;">
<tr>
<td>
Time:
</td>
<td>
<%# string.Format("{0:h:mm tt}", Eval("DateTime")) %>
</td>
</tr>
<tr>
<td>
Date:
</td>
<td>
<%# string.Format("{0:d}", Eval("DateTime")) %>
</td>
</tr>
<tr>
<td>
Chip Stack:
</td>
<td>
<%# string.Format("{0:C}", Eval("ChipStack")) %>
</td>
</tr>
<tr>
<td>
Notes:
</td>
<td>
<%# Eval("Notes") %>
</td>
</tr>
<tr>
<td colspan="2" style="text-align:right;">
<asp:Button runat="server" ID="btnDelete" CssClass="deleteButton" CommandArgument='<%# Eval("WaypointID") %>' CommandName="Delete" Text="X" OnClientClick="return confirm('Are you sure you want to delete this waypoint?');" />
</td>
</tr>
</table>
</td>
</ItemTemplate>
</telerik:RadListView>
protected void lstGameWaypoints_ItemCommand(object sender, Telerik.Web.UI.RadListViewCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
//Do stuff
}
}
更新:
看来,这是一个问题与RadAjaxManager,我用来托管这个控件的面板。如果我在面板上禁用ajax,一切都像预期的那样工作。
这是一个完整的代码…
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
<AjaxSettings>
<telerik:AjaxSetting AjaxControlID="panGameWaypoints">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="panGameWaypoints" LoadingPanelID="RadAjaxLoadingPanel1" />
</UpdatedControls>
</telerik:AjaxSetting>
<telerik:AjaxSetting AjaxControlID="panGameDetails">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="panGameDetails" LoadingPanelID="RadAjaxLoadingPanel1" />
</UpdatedControls>
</telerik:AjaxSetting>
</AjaxSettings>
<ClientEvents OnRequestStart="RequestStart" OnResponseEnd="RequestEnd" />
</telerik:RadAjaxManager>
<telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" Transparency="60">
<div class="loading">
<asp:Image ID="Image1" runat="server" ImageUrl="~/Images/loading3.gif" AlternateText="loading" />
</div>
</telerik:RadAjaxLoadingPanel>
<asp:Panel runat="server" ID="panGameWaypoints" CssClass="GameWaypoints">
<table style="width:900px;margin:auto;">
<tr>
<telerik:RadListView runat="server" ID="lstGameWaypoints" AllowPaging="false"
OnDataBound="lstGameWaypoints_DataBound"
OnItemCreated="lstGameWaypoints_ItemCreated"
OnNeedDataSource="lstGameWaypoints_NeedDataSource">
<EmptyDataTemplate>
<div style="width: 100px;margin: 10px auto auto auto;"><button class="AddWaypoint">Add Waypoint</button></div>
</EmptyDataTemplate>
<ItemTemplate>
<td>
<table style="border:1px solid black;width: 232px;height: 70px;margin:auto;">
<tr>
<td>
Time:
</td>
<td>
<%# string.Format("{0:h:mm tt}", Eval("DateTime")) %>
</td>
</tr>
<tr>
<td>
Date:
</td>
<td>
<%# string.Format("{0:d}", Eval("DateTime")) %>
</td>
</tr>
<tr>
<td>
Chip Stack:
</td>
<td>
<%# string.Format("{0:C}", Eval("ChipStack")) %>
</td>
</tr>
<tr>
<td>
Notes:
</td>
<td>
<%# Eval("Notes") %>
</td>
</tr>
<tr>
<td colspan="2" style="text-align:right;">
<asp:Button runat="server" ID="btnDelete" CssClass="deleteButton" CommandArgument='<%# Eval("WaypointID") %>' CommandName="Delete" Text="X" OnClientClick="return confirm('Are you sure you want to delete this waypoint?');" />
</td>
</tr>
</table>
</td>
</ItemTemplate>
</telerik:RadListView>
</tr>
</table>
</asp:Panel>
我创建了一个小测试用例(包括在下面),看看我是否可以重现你的问题,你的实现和我的实现之间有三个主要区别:
- 我没有指定
RadAjaxLoadingPanel
- 我没有指定任何
ClientEvents
(即RequestStart
,RequestEnd
) - 我没有使用
OnClientClick
确认对话框
解决方案# 1
经过检查并将这些添加到我的测试用例之后,我发现与RadAjaxManager
使用确认对话框存在一个问题。稍作研究后,提供了以下解决方案:
将OnClientClick
代码更改为以下内容:
OnClientClick="if(!confirm('Are you sure you want delete this?')) return false;"
这是否解决了您的问题?
这里有一些关于这个问题的文档:
www.telerik.com/help/aspnet-ajax/ajax-confirmation.html
以上应该可以解决您的问题,但如果不能,请尝试暂时删除RequestStart
和RequestEnd
客户端事件,并继续剥离"额外",直到找到问题。
下面是一个按预期工作的测试用例:
ASPX:
<telerik:RadAjaxManager ID="rda" runat="server">
<AjaxSettings>
<telerik:AjaxSetting AjaxControlID="pnlTest">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="pnlTest" />
</UpdatedControls>
</telerik:AjaxSetting>
</AjaxSettings>
</telerik:RadAjaxManager>
<asp:Panel ID="pnlTest" runat="server">
<telerik:RadListView ID="lst" runat="server" OnItemCommand="lst_Command" OnNeedDataSource="lst_NeedDataSource">
<ItemTemplate>
<%#Eval("Test")%>
<asp:Button ID="btnDelete" runat="server" CommandArgument='<%#Eval("Test")%>' OnClientClick="if(!confirm('Are you sure you want delete this?')) return false;" CommandName="Delete" Text="Test" />
</ItemTemplate>
</telerik:RadListView>
<asp:Label ID="lblCommandArg" runat="server"></asp:Label>
</asp:Panel>
后台代码:
protected void lst_NeedDataSource(object sender, RadListViewNeedDataSourceEventArgs e)
{
DataTable table = new DataTable();
table.Columns.Add("Test", typeof(string));
DataRow row = table.NewRow();
row.SetField<string>("Test", "Testing");
table.Rows.Add(row);
row = table.NewRow();
row.SetField<string>("Test", "Testing again");
table.Rows.Add(row);
lst.DataSource = table;
}
protected void lst_Command(object sender, RadListViewCommandEventArgs e)
{
lblCommandArg.Text = e.CommandArgument.ToString();
}
使用RadAjaxPanel
代替RadAjaxManager
查看您的代码,看起来最简单的解决方案可能是使用RadAjaxPanel
而不是RadAjaxManager
。我不确定这是否适合你,但这可能是让你的代码工作的最简单的方法。
使用一个RadAjaxPanel为panGameWaypoints
而不是一个常规的面板,这将确保所有包含在将使用AJAX:
<telerik:RadAjaxPanel ID="panGameWaypoints" runat="server">
<telerik:RadListView ID="RadListView1" runat="server" ... >
</telerik:RadAjaxPanel>
您是否尝试将以下代码添加到Page_Init事件中?
RadListView1.OnDataBound += new EventHandler(lstGameWaypoints_DataBound);
RadListView1.OnItemCreated += new EventHandler(lstGameWaypoints_ItemCreated);
RadListView1.OnItemCommand += new EventHandler(lstGameWaypoints_ItemCommand);
我认为你需要告诉RadAjaxManager
从自己更新列表…?这没有意义,但尝试将此添加到您的RadAjaxManager
:
<telerik:AjaxSetting AjaxControlID="lstGameWaypoints">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="lstGameWaypoints" LoadingPanelID="RadAjaxLoadingPanel1" />
</UpdatedControls>
</telerik:AjaxSetting>
这样RadListView
将重新连接它的事件。
我不认为你需要添加
<telerik:AjaxSetting AjaxControlID="panGameWaypoints">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="panGameWaypoints" LoadingPanelID="RadAjaxLoadingPanel1" />
</UpdatedControls>
</telerik:AjaxSetting>
用这个代替上面的
<telerik:AjaxSetting AjaxControlID="lstGameWaypoints">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="lstGameWaypoints" LoadingPanelID="RadAjaxLoadingPanel1" />
</UpdatedControls>
</telerik:AjaxSetting>
和我没有看到lstGameWaypoints ItemCommand事件是有线的,你也可以使用OnItemDeleting事件代替ItemCommand。
我认为问题在于您附加在btnDelete上的OnClientClick事件。
我试着模拟你的情况,我已经用RadButton替换了按钮(你在一个Telerik环境中,对吧?),这暴露了事件onclientclicked。我创建了一个js函数:
function RadConfirm_Delete(sender, args)
{
var callBackFunction = Function.createDelegate(sender, function (shouldSubmit)
{
if (shouldSubmit)
{
this.click();
}
});
radconfirm("Are you sure you want to delete this waypoint?", callBackFunction, 350, 100, null, "Confirm delete");
args.set_cancel(true);
}
,我已经设置了RadButton如下:
<telerik:RadButton runat="server" ID="btnDelete" CssClass="deleteButton" CommandArgument='<%# Eval("WaypointID") %>' CommandName="Delete" Text="X" OnClientClicking="RadConfirm_Delete" />
一切正常。
让我知道!