【问题标题】:RadListView ItemCommand not firingRadListView ItemCommand 未触发
【发布时间】:2011-10-04 08:29:19
【问题描述】:

我有一个 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>

【问题讨论】:

    标签: c# asp.net events telerik telerik-grid


    【解决方案1】:

    我创建了一个小测试用例(包括在下面),看看我是否可以重现您的问题,您的实现与我的实现之间存在三个主要区别:

    1. 我没有指定RadAjaxLoadingPanel
    2. 我没有指定任何ClientEvents(即RequestStart、RequestEnd)
    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


    以上应该可以解决您的问题,但如果不能尝试暂时删除 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。我不确定这是否适合您,但这可能是让您的代码正常工作的最简单方法。

    为panGameWaypoints 使用 RadAjaxPanel 而不是常规面板,这将确保其中包含的所有内容都将使用 AJAX:

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

    【讨论】:

      【解决方案2】:

      您是否尝试在 Page_Init 事件中添加以下代码?

      RadListView1.OnDataBound += new EventHandler(lstGameWaypoints_DataBound);
      RadListView1.OnItemCreated += new EventHandler(lstGameWaypoints_ItemCreated);
      RadListView1.OnItemCommand += new EventHandler(lstGameWaypoints_ItemCommand);
      

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

      【讨论】:

      • 感谢您的输入,试过了。不走运...我发现它与我正在使用的 RadAjaxManager 有关。如果我禁用它,一切都会按预期工作。
      【解决方案3】:

      我认为您需要告诉RadAjaxManager 更新列表本身...?这没有任何意义,但请尝试将其添加到您的 RadAjaxManager:

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

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

      【讨论】:

        【解决方案4】:

        我不需要你添加

        <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 事件是有线的,您也可以使用 itemcommand 的 OnItemDeleting 事件。

        【讨论】:

          【解决方案5】:

          我认为问题出在您在 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" />
          

          似乎一切正常。

          告诉我!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多