有哪些 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 性能改进机会?的主要内容,如果未能解决你的问题,请参考以下文章