有哪些 ASP.NET GridView 性能改进机会?

Posted

技术标签:

【中文标题】有哪些 ASP.NET GridView 性能改进机会?【英文标题】:What are some ASP.NET GridView performance improvement opportunities? 【发布时间】:2010-10-09 21:19:08 【问题描述】:

我有一个相当基本的 ASP.NET 应用程序。它查询一些数据并在 GridView 中显示数据(可能有 0 - 2000 条左右的记录)。我一直在尝试找到一些方法来使其更流畅、最佳实践等,因为在渲染 GridView 时它似乎有点迟钝。我已经看到了一些关于使用 CSS 与直接在 GridView 上设置所有样式的线程,但我不确定这会是什么样子。

这就是 GridView 现在的样子...

<asp:GridView ID="gvResults" runat="server" DataKeyNames="ORDNO" AutoGenerateColumns="False"
    CellPadding="4" ForeColor="#333333" OnSelectedIndexChanged="gvResults_SelectedIndexChanged"
    Width="100%" OnRowDataBound="gvResults_RowDataBound" meta:resourcekey="gvResultsResource1">
    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
    <Columns>
        <asp:BoundField DataField="CSTNO" HeaderText="CUST" meta:resourcekey="BoundFieldResource1" />
        <asp:BoundField DataField="ORDNO" HeaderText="RMA NUMBER" meta:resourcekey="BoundFieldResource2" />
        <asp:BoundField DataField="CSTORD" HeaderText="CUST PO NUMBER" meta:resourcekey="BoundFieldResource3" />
        <asp:BoundField DataField="ORDDTE" HeaderText="ORDER DATE" meta:resourcekey="BoundFieldResource4" />
        <asp:BoundField DataField="INVDTE" HeaderText="INVOICE DATE" htmlEncode="False" meta:resourcekey="BoundFieldResource5" />
        <asp:CommandField ShowSelectButton="true" ButtonType="Link" meta:resourcekey="CommandFieldResource1"  />
    </Columns>
    <EditRowStyle BackColor="#999999" />
    <EmptyDataTemplate>
        <span style="color: Red;">
            <asp:Literal ID="litErrorNoRMAFound" runat="server" EnableViewState="False" meta:resourcekey="litErrorNoRMATagsFoundResource1"
                OnInit="litErrorNoRMAFound_Init"></asp:Literal>
        </span>
    </EmptyDataTemplate>
    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#3494CC" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" />
    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
</asp:GridView>

提前感谢您的任何想法/cmets。

编辑 要求不允许对数据进行分页。我也在寻找有关 CSS 利用率和 GridView 的具体信息...

【问题讨论】:

在一个页面上显示 2000 条记录的要求是愚蠢的,因为它创建了一个虚拟的大海捞针。=P 我相信你意识到了这一点,但它让我觉得取笑更好愚蠢的要求。 @Greg:我个人同意,这是非常多的数据,并且缺乏易于识别的信息。但用户有时确实有特定需求…… 用户,离不开他们,离不开他们。 @Greg: 有时我们是用户 :( 【参考方案1】:

不要使用 GridView。如果您想控制,请使用中继器。

【讨论】:

【参考方案2】: 如果可能,禁用视图状态。 使用中继器代替网格并使用 你自己的html,那会减少 渲染的标记 尝试使用存储过程 如果你有任何方法可以得到 您的其他表中的一些数据 D b。尝试使用视图

【讨论】:

【参考方案3】:

您需要启用分页以避免出现将数百条记录呈现到页面的情况。本质上,您将使用页面控件来移动记录而不是滚动条。

一个可以帮助很多的相关选项是使用一个ObjectDataSource,它只检索网格想要显示的那些记录。这使用 SQL Server 中的新 ROW_NUMBER() 构造。下面是检索特定记录范围的 ObjectDataSource 方法的示例。它使用了我的 DAL,但您应该能够得到一个非常清晰的想法:

    [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public List<SelectClassData> GetList(string sortType, int startRowIndex, int maximumRows)
    
        if (!BusinessUtilities.SQLSafe(sortType))
            throw new Exception("Illegal value in request (unsafe).");
        startRowIndex++;
        int EndRow = startRowIndex + maximumRows;
        using (BSDIQuery qry = new BSDIQuery())
        
            if (sortType.Length == 0)
                sortType = "Title";
            return
                qry.Command(
                    "With OrderedClassEvent as (Select ClassID, Title, StartDate, EndDate, ROW_NUMBER() OVER (ORDER BY " + sortType + ") as RowNum From ClassEvent)")
                    .Append(" Select ClassID, Title, StartDate, EndDate From OrderedClassEvent Where RowNum Between @StartRow AND ").ParamVal(startRowIndex)
                    .Append("@EndRow ").ParamVal(EndRow)
                    .Append("Order By RowNum")
                    .ReturnList<SelectClassData>();
        
   

关于使用 CSS 等不会使网格更简洁,但它允许您在“皮肤”文件中定义网格属性(例如 FooterStyle、HeaderStyle 等)一个主题目录。它是可选的,但您也可以使用 CSS 为每个属性定义样式。皮肤文件将显示一个“模板”GridView,其中每个属性都有 CssClass。当您参考创建网格时,您将参考皮肤文件,然后忽略该文件中找到的所有属性定义(gridview 不需要它们,因为它知道该怎么做根据皮肤)。如果您想让所有网格看起来都一样,这尤其有用。

【讨论】:

【参考方案4】:

由于不允许分页,我肯定会探索减少此网格的总有效负载:

    使用中继器控件并构建本机 TABLE 来呈现此网格而不是数据网格控件 - 这样我将完全控制有效负载。比如: 使用 100% CSS 样式而不是控件属性。 禁用视图状态 (?)

请注意,这里的性能问题与 asp.net 的关系不大,而与从服务器到客户端计算机的数据传输量有关。

【讨论】:

【参考方案5】:

使用 CSS 应该可以减小标记的大小。

http://www.jigar.net/howdoi/viewhtmlcontent197.aspx 展示了如何使用 CSS 设置 gridview 的样式。

您可以用CSS Control Adapters 替换整个网格呈现方式,这将有助于进一步减小标记大小。

【讨论】:

【参考方案6】:

您可以输出前 X 个项目,然后在页面加载后获取下一个 X 项目,依此类推。这可能会使最终用户的页面看起来更快捷。

您还应该调查究竟是什么让页面变慢,还要检查数据库查询是否可以使用索引或其他东西进行优化。

【讨论】:

谢谢你的想法...查询速度极快,看起来真的是在页面渲染方面。【参考方案7】:

如果您不使用分页(如评论中所述),请考虑使用 DataList 甚至是 Repeater 以减少对象本身的开销。

【讨论】:

【参考方案8】:

您可以尝试使用server-side viewstates。它在服务器上增加了一点负载,但页面加载/更新应该更快。

【讨论】:

【参考方案9】:

一些想法:

尽可能消除视图状态。 如果您使用的是 IIS6 或更高版本,请考虑启用 compression。 在 GridView 上启用分页以缩短请求时间。 确保您部署的生产解决方案是发布编译的,没有恶意调试或跟踪指令

【讨论】:

我会询问我们的 Web 服务团队有关启用压缩的问题。据我所知,视图状态无法对此进行调整,另外 2 个根据要求是不可能的,或者已经尝试过了。 如果你不能摆脱视图状态,压缩可能没有多大帮助。出于压缩目的,Viewstate 相当于随机数据,而随机数据只是不压缩:/ 不过仍然值得一试。【参考方案10】:

您自己回答了 - 压缩它以使其更拉链。使用压缩 http 处理程序。

【讨论】:

【参考方案11】:

是否启用了视图状态?这可能是很多隐藏数据。

【讨论】:

【参考方案12】:

启用分页将起作用 ;)

【讨论】:

以上是关于有哪些 ASP.NET GridView 性能改进机会?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 2.0中GridView控件的怪怪问题

ASP.NET Core 6 的性能改进

提高 ASP.NET 网站性能的方法都有哪些? [关闭]

asp.net gridview 复选框选择

ASP.NET 中 GridView 中的内部网格线

在 Gridview 中选择一行并将其删除 - Asp.net