RadListView ItemCommand не запускается - PullRequest
3 голосов
/ 04 октября 2011

У меня есть 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
    }
}

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>

Ответы [ 5 ]

1 голос
/ 14 октября 2011

Я создал небольшой тестовый пример (включен ниже), чтобы посмотреть, смогу ли я воспроизвести вашу проблему, и между вашей реализацией и моей было три основных различия:

  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. Я не уверен, подходит ли вам этот вариант, но это, вероятно, самый простой способ заставить ваш код работать.

Используйте RadAjaxPanel для panGameWaypoints вместо обычной панели, которая гарантирует, что все содержимое внутри будет использовать AJAX:

<telerik:RadAjaxPanel ID="panGameWaypoints" runat="server">
    <telerik:RadListView ID="RadListView1" runat="server" ... >
</telerik:RadAjaxPanel>
0 голосов
/ 14 октября 2011

Я думаю, что проблема в событии OnClientClick, которое вы прикрепили к btnDelete.

Я попытался смоделировать вашу ситуацию, и я заменил Button на RadButton (вы находитесь в среде 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 голосов
/ 13 октября 2011

Я думаю, вам нужно сказать RadAjaxManager обновить список от себя ...? Это не имеет смысла, но попробуйте добавить это к вашему RadAjaxManager:

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

Таким образом, RadListView перепишет свои события.

0 голосов
/ 13 октября 2011

Не думаю, что вам нужно добавлять

<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, заданное в команде item.

0 голосов
/ 04 октября 2011

Вы пытались добавить следующий код в событие Page_Init?

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

Это должно перехватывать ваши события на каждом постбеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...