Как обеспечить функцию автосохранения в Telerik RadGrid?

Я использую Telerik RadGrid с функцией Пакетное редактирование. Я пытаюсь реализовать функцию автоматического сохранения. Я добавил свой код ниже

<form id="form1" runat="server">
         <div id="Demo">
        <telerik:RadListBox RenderMode="Lightweight" runat="server" ID="SavedChangesList" Width="600px" Height="200px" Visible="false"></telerik:RadListBox>
        <telerik:RadGrid RenderMode="Lightweight" ID="RadGrid1" GridLines="None" runat="server" AllowAutomaticDeletes="True"
            AllowAutomaticInserts="True" PageSize="10" OnItemDeleted="RadGrid1_ItemDeleted" OnItemInserted="RadGrid1_ItemInserted"
            OnItemUpdated="RadGrid1_ItemUpdated" OnPreRender="RadGrid1_PreRender" AllowAutomaticUpdates="True" AllowPaging="True"
            AutoGenerateColumns="False" OnBatchEditCommand="RadGrid1_BatchEditCommand" DataSourceID="SqlDataSource1">
            <MasterTableView CommandItemDisplay="TopAndBottom" DataKeyNames="ID"
                DataSourceID="SqlDataSource1" HorizontalAlign="NotSet" EditMode="Batch" AutoGenerateColumns="False">
                <BatchEditingSettings EditType="Cell" />
                <SortExpressions>
                    <telerik:GridSortExpression FieldName="ID" SortOrder="Descending" />
                </SortExpressions>
                <Columns>

                </Columns>
            </MasterTableView>
            <ClientSettings AllowKeyboardNavigation="true"></ClientSettings>
        </telerik:RadGrid>
    </div>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=STRMV3097\MSSQLSERVER2012;Initial Catalog=ToolsandTechResearchShowcase;User ID=pra_app_user;Password=pra"
        DeleteCommand="Delete Command" InsertCommand="Insert Command"
        SelectCommand="Select" UpdateCommand="Update">
    </asp:SqlDataSource>
</form>

person Indira Pranoi    schedule 29.03.2016    source источник


Ответы (1)


Создайте таймер (используйте собственный метод браузера setInterval()) и клиентский API сетки (см. метод saveChanges(tableView) или saveAllChanges()): http://docs.telerik.com/devtools/aspnet-ajax/control/grid/data-editing/edit-mode/batch-editing/client-side-api. Вам нужна ссылка на менеджер пакетного редактирования, методы которого это, например, grid.get_batchEditingManager(), где сетка является ссылкой на RadGrid.

Вот базовый пример, который вы сможете запустить немедленно.

        <telerik:RadGrid ID="RadGrid1" runat="server" MasterTableView-EditMode="Batch" AllowAutomaticDeletes="True"
                         AllowAutomaticInserts="True" AllowAutomaticUpdates="True" AllowPaging="True" PageSize="10" DataSourceID="SqlDataSource1"></telerik:RadGrid>
        <telerik:RadCodeBlock runat="server" ID="RadCodeBlock1">
            <script>
                var autoSaveInterval = null;

                //store the interval so you can cancel it at any time you like
                function saveGridChanges() {
                    var grid = $find("<%=RadGrid1.ClientID%>");//reference the grid
                    var batchEditManager = grid.get_batchEditingManager();//get the batch edit manager
                    batchEditManager.saveAllChanges();//use its API to save the changes
                }
                //use the Sys.Application.Load event as this is the earliest point at which IScriptControl client-side objects can be accessed
                Sys.Application.add_load(function () {
                    autoSaveInterval = window.setInterval(saveGridChanges, 30000);
                });
            </script>
        </telerik:RadCodeBlock>
        <%--Optionally, add AJAX for a loading indicator--%>
        <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" Skin="Black"></telerik:RadAjaxLoadingPanel>
        <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" DefaultLoadingPanelID="RadAjaxLoadingPanel1">
            <AjaxSettings>
                <telerik:AjaxSetting AjaxControlID="RadGrid1">
                    <UpdatedControls>
                        <telerik:AjaxUpdatedControl ControlID="RadGrid1" />
                    </UpdatedControls>
                </telerik:AjaxSetting>
            </AjaxSettings>
        </telerik:RadAjaxManager>

        <%--Data source. Here is the one from the Telerik demo--%>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
                           DeleteCommand="DELETE FROM [Products] WHERE [ProductID] = @ProductID" InsertCommand="INSERT INTO [Products] ([ProductName], [CategoryID], [UnitPrice], [Discontinued], [QuantityPerUnit], [UnitsInStock]) VALUES (@ProductName, @CategoryID, @UnitPrice, @Discontinued, @QuantityPerUnit, @UnitsInStock)"
                           SelectCommand="SELECT [ProductID], [ProductName], [Products].[CategoryID], [Categories].[CategoryName] as CategoryName, [UnitPrice], [Discontinued], [QuantityPerUnit], [UnitsInStock] FROM [Products] JOIN Categories ON Products.CategoryID=Categories.CategoryID"
                           UpdateCommand="UPDATE [Products] SET [ProductName] = @ProductName, [CategoryID] = @CategoryID, [UnitPrice] = @UnitPrice, [Discontinued] = @Discontinued, [QuantityPerUnit] = @QuantityPerUnit, [UnitsInStock] = @UnitsInStock WHERE [ProductID] = @ProductID">
            <DeleteParameters>
                <asp:Parameter Name="ProductID" Type="Int32"></asp:Parameter>
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="ProductName" Type="String"></asp:Parameter>
                <asp:Parameter Name="CategoryID" Type="Int32"></asp:Parameter>
                <asp:Parameter Name="UnitPrice" Type="Decimal"></asp:Parameter>
                <asp:Parameter Name="Discontinued" Type="Boolean"></asp:Parameter>
                <asp:Parameter Name="QuantityPerUnit" Type="String"></asp:Parameter>
                <asp:Parameter Name="UnitsInStock" Type="Int16"></asp:Parameter>
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="ProductName" Type="String"></asp:Parameter>
                <asp:Parameter Name="CategoryID" Type="Int32"></asp:Parameter>
                <asp:Parameter Name="UnitPrice" Type="Decimal"></asp:Parameter>
                <asp:Parameter Name="Discontinued" Type="Boolean"></asp:Parameter>
                <asp:Parameter Name="QuantityPerUnit" Type="String"></asp:Parameter>
                <asp:Parameter Name="UnitsInStock" Type="Int16"></asp:Parameter>
                <asp:Parameter Name="ProductID" Type="Int32"></asp:Parameter>
            </UpdateParameters>
        </asp:SqlDataSource>

Я также советую добавить обработчик для других событий пакетного редактирования, чтобы поднимать флаги и/или отменять интервал, когда пользователь в данный момент редактирует ячейку/строку, чтобы предотвратить потерю данных и проблемы.

person rdmptn    schedule 29.03.2016
comment
Я добавил свой код выше. Пожалуйста, посмотрите и не могли бы вы объяснить немного больше? - person Indira Pranoi; 30.03.2016
comment
Вы пытались реализовать описанную мной логику JavaScript? С какой именно проблемой вы сталкиваетесь при попытке? - person rdmptn; 30.03.2016
comment
Нет, я этого не пробовал. На самом деле я этого не понял. - person Indira Pranoi; 30.03.2016
comment
Это отличается от того, чтобы сделать это для меня. Я скоро обновлю свой пост - person rdmptn; 30.03.2016
comment
Спасибо .. Большое спасибо. Это работает. Если мне нужно сохранить изменения всякий раз, когда я щелкаю за пределами ячейки, какие изменения я должен сделать..? - person Indira Pranoi; 30.03.2016
comment
Используйте событие закрытой ячейки - person rdmptn; 30.03.2016
comment
Я не смог найти событие закрытия ячейки вместо setInterval. Не могли бы вы помочь мне иметь функцию автосохранения, как только я щелкнул за пределами ячейки? @rdmptn - person Indira Pranoi; 31.03.2016
comment
Он называется OnBatchEditClosed docs.telerik.com. /devtools/aspnet-ajax/controls/сетка/ - person rdmptn; 31.03.2016
comment
BatchEditClose не работал. Поэтому я попытался использовать onBatchEditCellValueChanged. Он работает нормально. Но единственная проблема заключается в том, что страница обновляется, как только я щелкнул за пределами ячейки. Есть ли способ избавиться от этого. Большое спасибо за помощь @rdmtn - person Indira Pranoi; 31.03.2016
comment
Я уже использую Ajax, как показано в вашем коде. Но это обновляет @rdmptn - person Indira Pranoi; 31.03.2016
comment
Тогда есть что-то еще, например, неправильная настройка ajax или вложенные настройки. я думаю тебе стоит открыть тикет с телериком - person rdmptn; 31.03.2016