关于asp.net:gridview排序:每次都需要重读?

gridview sorting: need to re-read every time?

我正在使用代码填充 GridView,将数据源设置为查询返回的数据集。因此,显然排序和分页不仅仅像我使用 datasourceid= some sqldatasource 那样神奇地工作。

我在网上找到了许多如何执行此操作的示例,但它们似乎每次都重新执行查询。查询的内容不应该保存在视图状态吗?有什么方法可以只获取之前的查询结果并重新排序而无需返回数据库? (它是否将所有数据保存在视图状态?如果是,为什么我不能得到它?将它全部发送到用户的浏览器并全部发送回来似乎很愚蠢,浪费所有带宽,如果没有到达它的方法。)

另外,如果我尝试允许分页,似乎每次用户转到另一个页面时我都必须重新执行查询。如果用户先排序然后翻页,那么我必须记住隐藏字段中的排序顺序或类似内容,这样我才能重新读取数据,重新排序,然后转到正确的页面。

鉴于当您使用数据源控件时,所有这些行为都是内置的,我想我在这里遗漏了一些东西。但是考虑到所有以这种缓慢而艰难的方式完成的示例,如果我遗漏了什么,那么很多其他程序员也会遗漏它。


如果您每次通过数据集对列或页面进行排序时都使用 ASP.NET GridView 控件,那么您就是在进行服务器回发。使用此特定控件进行排序和分页从未"神奇"地工作过,并且长期以来一直是我的一个问题。

您可以通过将构建网格的数据源存储在内存中来加快处理速度,无论是作为会话还是通过 ViewState。两者都有优点和缺点,我建议你阅读。

如果可能的话,我建议忘记 ASP.NET GridView 并查看客户端解决方案,例如 jQuery jqGrid。它使用 AJAX 调用来排序和分页,而且速度快得多,而且不那么令人头疼。唯一的缺点是学习曲线,但相信我从长远来看这是值得的。


是的,gridview 每次都会重新执行查询。

如果查询时间过长,您可以手动将数据存储在会话或 ViewState 中。而在填充网格的算法中,只需直接读取它们,而不是运行查询。

您可以在页面加载事件中,在没有回发的情况下运行一次查询(您可以使用

检查回发

1
2
3
if (!Page.IsPostBack){
    //Run the query and save it to the session
}

和填充网格的方法,应该直接从会话中读取。无需再次运行查询