RadListView项命令未触发

3
我有一个 RadListView,并且绑定了 lstGameWaypoints_ItemCommand 事件处理程序,如下所示。在网格首次显示时,单击删除按钮成功触发了后台请求并触发 ItemCommand 事件。
一旦后台请求完成,似乎事件处理程序没有再次连接,再次单击删除按钮将不会执行任何操作。之前有人遇到类似的问题吗?
<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>
5个回答

1

我创建了一个小的测试用例(如下所示),以查看是否可以重现您的问题,我的实现与您的实现之间有三个主要区别:

  1. 我没有指定 RadAjaxLoadingPanel
  2. 我没有指定任何 ClientEvents(即 RequestStartRequestEnd
  3. 我没有使用 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


以上方法应该可以解决您的问题,但如果不行,请尝试暂时移除RequestStartRequestEnd客户端事件,并继续排查直到找到问题所在。
以下是一个预期工作的测试用例:
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。我不确定这是否适用于您,但这可能是让您的代码正常工作的最简单方法。

panGameWaypoints 替换为 RadAjaxPanel,而不是普通的 Panel,这将确保其中包含的所有内容都使用 AJAX:

<telerik:RadAjaxPanel ID="panGameWaypoints" runat="server">
    <telerik:RadListView ID="RadListView1" runat="server" ... >
</telerik:RadAjaxPanel>

0

我认为你需要告诉 RadAjaxManager 从自身更新列表...?这听起来没有意义,但是尝试将以下内容添加到你的 RadAjaxManager 中:

<telerik:AjaxSetting AjaxControlID="lstGameWaypoints">
   <UpdatedControls>
      <telerik:AjaxUpdatedControl ControlID="lstGameWaypoints" LoadingPanelID="RadAjaxLoadingPanel1" />
   </UpdatedControls>
</telerik:AjaxSetting>

这样RadListView将重新连接它的事件。


0

我觉得你不需要添加

<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。


0

我认为问题出在你在btnDelete上挂载的OnClientClick事件。

我试图模拟你的情况,并用RadButton替换了Button(你在Telerik环境中,对吧?),它公开了OnClientClicking事件。因此,我创建了一个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" />

所有的似乎都正常工作。

请告诉我!


0
你尝试将以下代码添加到 Page_Init 事件中了吗?
RadListView1.OnDataBound += new EventHandler(lstGameWaypoints_DataBound);
RadListView1.OnItemCreated += new EventHandler(lstGameWaypoints_ItemCreated);
RadListView1.OnItemCommand += new EventHandler(lstGameWaypoints_ItemCommand);

这应该在每次回发时挂钩您的事件。


谢谢您提供的输入,我试过了,但没有成功...... 我已经确认了问题与我使用的RadAjaxManager有关。如果我将其禁用,一切都可以按预期工作。 - Maxim Gershkovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接