asp:UpdatePanel 在单个 RadGrid 行上

asp:UpdatePanel on individual RadGrid rows

我正在对在一个 .aspx 页面上具有 Telerik RadGrid 组件的内部应用程序进行一些更改。

RadGrid 中的每一行代表一个订单,并且有一个允许设置订单状态的下拉菜单。更改订单状态会更新该行中显示的其他几个订单属性。

到目前为止,更改订单状态会导致完整页面 post 返回并重新呈现。我很想使用 UpdatePanel 将其更改为部分 post。我可以将状态下拉列表(一个 RadCombo)包装在一个 UpdatePanel 中,它会处理所需的实际数据库更改(根据下面的代码示例),但是如果不更新 RadGrid 行上的其他属性,更新不会呈现给用户。

<telerik:RadGrid ID="OrdersGrid" runat="server" ...>
    <MasterTableView DataKeyNames="OrderId" AllowMultiColumnSorting="false">
        <NoRecordsTemplate ...></NoRecordsTemplate>
        <Columns>
            <telerik:GridBoundColumn ... />
            ...
            <telerik:GridTemplateColumn HeaderText="Order Status" UniqueName="OrderStatus">
                <ItemTemplate>
                    <asp:UpdatePanel runat="server">
                        <ContentTemplate>
                            <telerik:RadComboBox ID="RadOrderStatus" DataSourceID="OrderStatusDataSource" runat="server"
                                SelectedValue='<%# Bind("OrderStatus")  %>' Skin="Metro" Width="180px" DataTextField="OrderStatus"
                                DataValueField="OrderStatus" AutoPostBack="True" EnableLoadOnDemand="False" OnSelectedIndexChanged="RadOrderStatus_SelectedIndexChanged">
                            </telerik:RadComboBox>
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </ItemTemplate>
            </telerik:GridTemplateColumn>
        </Columns>
        <SortExpressions>...</SortExpressions>
    </MasterTableView>
</telerik:RadGrid>

我想知道如何使用 UpdatePanel 有效地包装 RadGrid 的行,以便可以更新整行而不是仅更新下拉列表所在的单元格。我已经尝试过试验标签放置,但我是 Telerik 的新手,因此不是很了解。

我可以在标记的哪个级别放置 UpdatePanel 以使其按我希望的方式工作?

或者是否有 Telerik 方法可以做到这一点?

我可以包装整个网格,但如果可能的话,我宁愿不在每个部分 post 上更新整个网格,允许的操作仅限于行级别,所以我看到一个完整的网格更新为浪费。

您不能在每一行周围放置一个 UpdatePanel。对于初学者,没有规定可以做到这一点(您也不能使用标准的 GridView 做到这一点)。然后,如果您设法做到这一点(例如,覆盖 Render 事件),您将获得无效标记,因为您不能在 <table> 内部和其他 <tr> 之间包含 <div> 元素节点。

关于性能的注意事项——AJAX 请求将使页面在服务器上经历其整个生命周期,因此所有代码将再次执行,任何耗时的操作也将被执行。 AJAX 和完整回发之间的唯一区别是在响应中呈现和 returned 的内容,因此您基本上只节省了网络时间。

您可以做的是:

  • 包裹整个网格。我会使用 RadAjaxPanel 和 RadAjaxLoadingPanel,这样你就有了一个漂亮的加载指示器。类似于:

        <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" Skin="Black"></telerik:RadAjaxLoadingPanel>
        <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" LoadingPanelID="RadAjaxLoadingPanel1">
            <telerik:RadGrid ID="RadGrid1" runat="server"></telerik:RadGrid>
        </telerik:RadAjaxPanel>
    
  • 或者,使用客户端代码和 jQuery。该组合可以调用将 return 数据的 WebService 或 PageMethod,您可以使用 jQuery 遍历 DOM 并更新其他元素(文本框、下拉列表,无论您有什么)。这会更难。