2011-10-04 98 views
3

我有一个RadListView和一个绑定到lstGameWaypoints_ItemCommand的事件处理程序,如下所示。在第一次显示网格时,单击删除按钮成功触发回发和ItemCommand触发。RadListView ItemCommand not firing

回发完成后,看起来事件处理程序没有再次连线,单击删除按钮不会引起任何操作。

有没有人见过类似的问题?

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

UPDATE:

看来,这是与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> 

回答

0

你尝试下面的代码添加到Page_Init事件?

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

这应该会在每次回发时挂钩您的活动。

+0

感谢您的输入,尝试这样做。没有运气......我已经解决了它与我正在使用的RadAjaxManager有关的问题。如果我禁用它,一切都按预期工作。 –

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事件insted的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" /> 

一切似乎工作的权利。

让我知道!

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。我不确定这是否适合您,但这可能是让您的代码正常工作的最简单方法。

使用RadAjaxPanel为panGameWaypoints而不是常规的面板,这将确保中包含将使用AJAX一切:

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