gridview排序:每次都需要重新读取?

时间:2012-04-30 14:28:40

标签: asp.net gridview

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

我已经在网上找到了一些如何执行此操作的示例,但它们似乎每次都会重新执行查询。查询的内容不应该保存在视图状态中吗?有没有办法获得以前的查询结果并重新排序而不必返回数据库? (它是否在视图状态下保存所有数据?如果是这样,为什么我不能达到它?将它全部发送到用户的浏览器并将其全部发送回去,浪费所有带宽,如果没有,这似乎相当愚蠢如何实现它。)

此外,如果我尝试允许分页,则每次用户转到另一个页面时,我都必须重新执行查询。如果用户对页面进行排序,那么我必须记住排序顺序在隐藏字段或其他类型中的位置,这样我就可以重新读取数据,重新排序,然后转到正确的页面。

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

2 个答案:

答案 0 :(得分:2)

如果您在每次通过数据集对列或页面进行排序时使用ASP.NET GridView控件,那么您将进行服务器回发。使用这个特殊控件进行排序和分页从来没有“神奇地”起作用,并且长期以来一直是我的错误。

您可以通过将正在构建网格的数据源存储在内存中作为会话或通过ViewState来加快速度。两者都有利弊,我建议你读一读。

如果可能,我建议忘记ASP.NET GridView并查看客户端解决方案,例如jQuery jqGrid。它使用AJAX调用进行排序和分页,速度更快,更轻松。唯一的缺点是学习曲线,但相信我从长远来看是值得的。

答案 1 :(得分:0)

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

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

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

检查回发)
if (!Page.IsPostBack){
    //Run the query and save it to the session
}

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