【问题标题】:Slow population of data using GridView in c# asp.net在 c# asp.net 中使用 GridView 缓慢填充数据
【发布时间】:2017-07-12 06:43:13
【问题描述】:

我正在使用 c# 在 asp.net 中的 Web 应用程序中工作,我想显示 10.000 到 1.000.000 之间的大量行。数据绑定很快,正如我在调试模式下逐步检查的那样,但是当页面尝试显示 GridView 时,它需要很长时间。有什么建议吗?

【问题讨论】:

  • 问题是当客户端(浏览器)尝试显示大量 GUI 时。你应该使用GridView分页
  • 你的对象是在绑定前填充的吗?通常更新需要时间。更新时是否可以将绑定设置为空,然后重新绑定。
  • @jdweng 它是空的,就像我在问题中所说的那样,所有代码都运行得很快,显示时间很慢。
  • 有了这些数字,放弃 aspnet 控件并编写自己的。即使您在 GridView 中启用分页,每次仍会加载整个数据集。而且我非常怀疑用户会浏览 100 多个页面,因此您可能需要实现一些过滤器。
  • @VDWWD 您对过滤器的看法是正确的,但是当您告诉某人您可以填充数据时,您不能告诉他们如果他愿意就看不到它们。你是什​​么意思写我自己的?就像构建一个 html 表格并在其中显示它们?

标签: c# asp.net gridview


【解决方案1】:

问题是当客户端(浏览器)尝试显示(渲染)大量 GUI 时。要求客户端渲染 10,000 - 1,000,000 行肯定会花费太多时间。

您的问题的一个解决方案是使用带有PageSize 属性的AllowPaging 进行分页。这会将 GridView 中显示的行数限制为您在 PageSize 属性中设置的行数。

HTML

<asp:GridView   ID="gv" 
                runat="server" 
                OnPageIndexChanging="gv_PageIndexChanging"
                OnPageIndexChanged="gv_PageIndexChanged"
                AllowPaging="true"
                PageSize="50">
        <Columns>
                ....

背后的代码

protected void gv_PageIndexChanged(object sender, EventArgs e)
{
    // bind your data
    gv.DataBind();
}
protected void gv_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    if (e.NewPageIndex == -1)
        gv.PageIndex = Int32.MaxValue;
    else
        gv.PageIndex = e.NewPageIndex;
}

建议:使用上述方案应该可以解决 UI 问题,但仍会获取大量数据。我建议在 SQL 级别UI 级别 中进行分页。

【讨论】:

  • 请记住,尽管只显示了 50 行,但每次仍会加载所有行。
  • @VDWWD 我知道,但请阅读 OP 的问题:数据绑定速度很快,正如我在调试模式下逐步检查的那样
  • 确实如此,但是加载一百万行来只显示 50 似乎是一种浪费。
  • @KobyDouek 成功了!非常感谢您的帮助!不幸的是,现在当我最终更改页面时,我得到了 System.OutOfMemoryException。 :(此外,我不太确定我是否收到了您的推荐评论。再次感谢您!
  • @VDWWD 任何更好的建议,因为你的论点似乎很合理
【解决方案2】:

您应该针对这个问题设计一个查询,例如,您希望在 gridview 分页的每个页面上显示 10,00000 条记录中的 10 条记录。

在下面的select语句中从你的gridview传递三个参数('@startRowIndex','@startRowIndex','@maximumRows')并使用ROW_NUMBER()方法(SQL Server 2005以上支持它)来获得顺序增加的行号.

SELECT ...
FROM
(SELECT ... 
     ROW_NUMBER() OVER(ORDER BY ColumnName) as RowNum
FROM Employees e
) as DerivedTableName
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1

链接1: http://www.4guysfromrolla.com/articles/031506-1.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2012-04-30
    • 2018-03-17
    相关资源
    最近更新 更多