我在更新面板中放置了一个GridView。
<asp:UpdatePanel ID="UpdatePanel4" UpdateMode="Conditional" ChildrenAsTriggers="true"
runat="server">
<asp:GridView ID="GridView_Overview" OnRowCommand="GridView_Layout_RowCommand" />
</asp:GridView>
</asp:UpdatePanel>
当用户按下按钮时,gridView将填充数据表:
GridView_Overview.DataSource = dataTable;
GridView_Overview.DataBind();
dataTable包含超过10000条记录。因此,对gridview的绑定过程大约需要3,4秒。
在gridview中选择行时:
protected void GridView_Layout_RowCommand(object sender, GridViewCommandEventArgs e)
{if (e.CommandName.Equals("Select"))
{
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow row = this.GridView_Overview.Rows[index];
Int64 pID = Int64.Parse(((Label)row.FindControl("ID")).Text); // abc
}
}
如上所述,执行GridView_Layout_RowCommand需要5,6秒。这是什么问题?如何提高选择行的性能。如果我丢弃了// abc代码行,那么它很快但是我无法获得进一步处理的ID值。
提前致谢。
答案 0 :(得分:2)
发生此问题是因为只有在遍历整个DOM之后才会触发UpdatePanel的异步回发。如果你要向页面添加超过10000条记录,那么你的DOM将会很庞大,而且延迟也很大。
解决问题的关键是在触发回发之前销毁GridView DOM元素。这样,遍历的DOM就会少得多。
有关处理此情况的一些提示,请参阅此博客文章:Slow performance of a GridView inside an UpdatePanel
至少,即使是最基本的分页形式也会提高客户端性能,因为它会减少添加到页面中的DOM元素的数量。为了获得最大的结果,您需要一个只选择每页数据的解决方案,这样您就不需要返回10000条记录,只显示一个子集。
答案 1 :(得分:0)
艾莉森的回答提到了这一点,我想强调一点:你真的不应该一次显示10,000条记录。即使使用最少的HTML(GridView
无法生成,因为它创建了长服务器端ID),您也创建了一个巨大的页面供用户下载。
您还为您的服务器创建了大量工作 - 完全没必要的工作(是?)。您希望一次有多少用户通过所有10,000条记录?即使是非常敬业的人,也要求很多。
提高性能并使页面更易用的最佳方法是添加分页。它有点复杂,但分页会减少服务器必须传输的数据大小,并显着减少浏览器在AJAX调用和呈现HTML上花费的时间。
MSDN概述了here。基本上,当页面发生变化时,你会想要做这样的事情(注意:不是确切的代码):
byte pageSize;
protected override void OnInit(EventArgs e)
{
pageSize = 50;
}
void GridView_Overview_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
GridView_Overview.DataSource = dataTable.Skip(pageSize * e.NewPageIndex).Take(pageSize);
GridView_Overview.DataBind();
}
您必须在代码隐藏页面的顶部添加using System.Data.Linq;
指令。您可能希望让用户选择每页的项目数,在这种情况下,您将从页面上的控件中获取pageSize
,而不是像我一样在OnInit
中设置它。
答案 2 :(得分:0)
使用浏览器的开发工具检查客户端发送回服务器的内容。你应该具体检查的是点击时帖子的大小。
如果我的怀疑是正确的(无法成像,他们自从我上次尝试并废弃它以来已修复它)它将整个视图状态发布回服务器并再次返回以保持控制状态服务器端完好无损你的10,000行的情况将是相当可观的。
限制此行为影响的唯一方法是每次用户移动网格页面时添加分页并从数据源获取页面,即不要立即将整个数据集绑定到网格。