Telerik网格更新无法在批量编辑中使用

时间:2014-04-28 16:18:23

标签: telerik-grid

我在ASPX,.net 4.5中使用RadGrid。数据出现并在我的网格中显示,但我无法更新,插入或删除记录。我尽可能地跟踪了样本版本:

http://demos.telerik.com/aspnet-ajax/grid/examples/data-editing/batch-editing/defaultcs.aspx

当我尝试修改网格中的数据时,点击“保存”,网格重新加载,数据不变。没有错误,只是没有更新。

最初我把网格包裹在ajax面板中,但是当这些问题发生时,我将其删除了。这没什么区别;虽然当我使用ajax面板时,经常点击“保存”图标时什么也没做。或似乎什么都不做。所以随着这种情况的消失,页面/网格会执行正常的回发,除非我的所有事件处理程序都没有被调用。调用Page_Load,但没有其他内容(例如RadGrid1_BatchEditCommand,RadGrid1_ItemUpdated)。似乎这些应该被调用。

ASPX代码:

<telerik:RadScriptManager runat="server" ID="RadScriptManager1" />
                <telerik:RadListBox runat="server" ID="SavedChangesList" Width="600px" Height="200px" Visible="false"></telerik:RadListBox>
                <telerik:RadGrid ID="RadGrid1" GridLines="None" runat="server" AllowAutomaticDeletes="True"
                    AllowAutomaticInserts="True" PageSize="10" Skin="Default" OnItemDeleted="RadGrid1_ItemDeleted" OnItemInserted="RadGrid1_ItemInserted"
                    OnItemUpdated="RadGrid1_ItemUpdated" OnPreRender="RadGrid1_PreRender" AllowAutomaticUpdates="True" AllowPaging="True"
                    AutoGenerateColumns="False" Width="1000px" OnBatchEditCommand="RadGrid1_BatchEditCommand" DataSourceID="sqlContractMatrix">
                    <MasterTableView CommandItemDisplay="TopAndBottom" DataKeyNames="ID" DataSourceID="sqlContractMatrix" HorizontalAlign="NotSet" EditMode="Batch" AutoGenerateColumns="False">
                        <BatchEditingSettings EditType="Cell" />
                        <SortExpressions>
                            <telerik:GridSortExpression FieldName="SiteID,ProductID" SortOrder="Descending" />
                        </SortExpressions>
                        <Columns>
                            <telerik:GridTemplateColumn HeaderText="Site" HeaderStyle-Width="150px" UniqueName="SiteID" DataField="SiteID">
                                <ItemTemplate>
                                    <%# Eval("SiteName") %>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <telerik:RadDropDownList runat="server" ID="ddlSites" AppendDataBoundItems="true" DataValueField="SiteID" DataTextField="SiteName" DataSourceID="sqlSites">

                                    </telerik:RadDropDownList>
                                </EditItemTemplate>
                            </telerik:GridTemplateColumn>

                            <telerik:GridTemplateColumn HeaderText="Product" HeaderStyle-Width="150px" UniqueName="ProductID" DataField="ProductID">
                                <ItemTemplate>
                                    <%# Eval("ProductName") %>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <telerik:RadDropDownList runat="server" ID="ddlProducts" DropDownWidth="250" DropDownHeight="400" DefaultMessage="Product" AppendDataBoundItems="true" DataValueField="ProductID" DataTextField="ProductName" DataSourceID="sqlProducts">

                                    </telerik:RadDropDownList>
                                </EditItemTemplate>
                            </telerik:GridTemplateColumn>

                            <telerik:GridAttachmentColumn DataSourceID="sqlContractMatrix" MaxFileSize="1048576" HeaderStyle-Width="250px"
                                EditFormHeaderTextFormat="Upload File:" HeaderText="HTML Template" AttachmentDataField="BinaryData"
                                AttachmentKeyFields="ID" FileNameTextField="TemplateFileBinary" DataTextField="TemplateFileBinary"
                                UniqueName="TemplateFileBinary">
                            </telerik:GridAttachmentColumn>

                            <%--
                            <telerik:GridBoundColumn DataField="TemplateFile" HeaderStyle-Width="200px" HeaderText="Template"
                                SortExpression="TemplateFile" UniqueName="TemplateFile">
                            </telerik:GridBoundColumn>
                            --%>

                            <telerik:GridBoundColumn DataField="PDFName" HeaderStyle-Width="200px" HeaderText="PDF Name"
                                SortExpression="PDFName" UniqueName="PDFName">
                            </telerik:GridBoundColumn>
                            <telerik:GridButtonColumn ConfirmText="Delete this record?" ConfirmDialogType="RadWindow"
                                ConfirmTitle="Delete" HeaderText="Delete" HeaderStyle-Width="50px" ButtonType="ImageButton"
                                CommandName="Delete" Text="Delete" UniqueName="DeleteColumn">
                            </telerik:GridButtonColumn>
                        </Columns>
                    </MasterTableView>
                </telerik:RadGrid>
                <asp:SqlDataSource ID="sqlContractMatrix" runat="server" ConnectionString="<%$ ConnectionStrings:FitTrack %>"
                    DeleteCommand="DELETE FROM ContractMatrix WHERE ID = @ID" 
                    InsertCommand="INSERT INTO ContractMatrix (SiteID, ProductID, TemplateFile, PDFName, LastModifiedDate, LastModifiedByID) VALUES (@SiteID, @ProductID, @TemplateFile, @PDFName, @LastModifiedDate, @LastModifiedByID)"
                    UpdateCommand="UPDATE ContractMatrix SET SiteID = @SiteID, ProductID = @ProductID, TemplateFile = @TemplateFile, PDFName = @PDFName, LastModifiedDate = GETDATE(), LastModifiedByID = @LastModifiedByID WHERE ID = @ID">
                    <DeleteParameters>
                        <asp:Parameter Name="ID" Type="Int32"></asp:Parameter>
                    </DeleteParameters>
                    <InsertParameters>
                        <asp:Parameter Name="SiteID" Type="Int32"></asp:Parameter>
                        <asp:Parameter Name="ProductID" Type="Int32"></asp:Parameter>
                        <asp:Parameter Name="TemplateFile" Type="String"></asp:Parameter>
                        <asp:Parameter Name="PDFName" Type="String"></asp:Parameter>
                    </InsertParameters>
                    <UpdateParameters>
                        <asp:Parameter Name="SiteID" Type="Int32"></asp:Parameter>
                        <asp:Parameter Name="ProductID" Type="Int32"></asp:Parameter>
                        <asp:Parameter Name="TemplateFile" Type="String"></asp:Parameter>
                        <asp:Parameter Name="PDFName" Type="String"></asp:Parameter>
                        <asp:Parameter Name="ID" Type="Int32"></asp:Parameter>
                    </UpdateParameters>
                </asp:SqlDataSource>

                <!-- SQL data sources for various lookup tables -->
                <asp:SqlDataSource ID="sqlSites" runat="server" ConnectionString="<%$ ConnectionStrings:FitTrack %>" ProviderName="System.Data.SqlClient" SelectCommand="SELECT SiteID, SiteName FROM gym.Site ORDER BY SiteID"></asp:SqlDataSource>
                <asp:SqlDataSource ID="sqlProducts" runat="server" ConnectionString="<%$ ConnectionStrings:FitTrack %>" ProviderName="System.Data.SqlClient"></asp:SqlDataSource>

C#代码:

protected void RadGrid1_BatchEditCommand(object sender, Telerik.Web.UI.GridBatchEditingEventArgs e)
        {
            SavedChangesList.Visible = true;
        }

        protected void RadGrid1_ItemUpdated(object source, Telerik.Web.UI.GridUpdatedEventArgs e)
        {
            GridEditableItem item = (GridEditableItem)e.Item;
            string id = item.GetDataKeyValue("ID").ToString();
            if (e.Exception != null)
            {
                e.KeepInEditMode = true;
                e.ExceptionHandled = true;
                NotifyUser("Record with ID " + id + " cannot be updated. Reason: " + e.Exception.Message);
            }
            else
            {
                NotifyUser("Record with ID " + id + " is updated!");
            }
        }

        protected void RadGrid1_ItemInserted(object source, GridInsertedEventArgs e)
        {
            if (e.Exception != null)
            {
                e.ExceptionHandled = true;
                NotifyUser("Product cannot be inserted. Reason: " + e.Exception.Message);
            }
            else
            {
                NotifyUser("New product is inserted!");
            }
        }

        protected void RadGrid1_ItemDeleted(object source, GridDeletedEventArgs e)
        {
            GridDataItem dataItem = (GridDataItem)e.Item;
            string id = dataItem.GetDataKeyValue("ID").ToString();
            if (e.Exception != null)
            {
                e.ExceptionHandled = true;
                NotifyUser("Product with ID " + id + " cannot be deleted. Reason: " + e.Exception.Message);
            }
            else
            {
                NotifyUser("Product with ID " + id + " is deleted!");
            }

        }

请帮忙。为什么没有发生数据更新?为什么没有调用代码隐藏中的telerik事件/方法?只有Page_Load()正在执行,其他都没有。

1 个答案:

答案 0 :(得分:0)

对我而言,这取决于尝试使用OnItemUpdated而不是OnUpdateCommand。

RadGrid的ItemDeleted,ItemUpdated和ItemInserted事件仅与直接绑定的ADO类型DataSource结合使用。我使用自己的DAL,所以这3个事件都没有被解雇。

所以解决方法是连接事件OnUpdateCommand和OnDeleteCommand。事件处理程序看起来像这样。

protected void radGrid_UpdateCommand(object sender, GridCommandEventArgs e)
{
    var gridDataItem = ((GridDataItem)e.Item);
    var table = gridDataItem.OwnerTableView;
    var keyValues = table.DataKeyValues[gridDataItem.ItemIndex];

    // Get key value.
    var id = keyValues["id"];

    // Get other values
    var foo = ((TextBox)gridDataItem["foo"].Controls[0]).Text;
    var bar = ((TextBox)gridDataItem["bar"].Controls[0]).Text;

    myDAL.Update(id, foo, bar);
}