ASP.NET 2.0网格中的分页改进

时间:2010-12-22 20:22:36

标签: c# .net asp.net datagrid datagridview

我目前有一个数据网格绑定到一个包含数万条记录的表。我使用现有的asp.net 2.0显示数据网格。我一次显示十条记录。

我的问题是每当我尝试访问下一页时,我从数据库中再次获取所有记录,然后显示所需的记录。这会减慢应用程序的速度。 .net 2.0中是否有功能可以帮助我优化此问题?我不能使用第三方控件或ajax。

UPDATE 我也不能一次使用SQL来获取10条记录。在不改变任何现有业务逻辑或数据检索的情况下,我想这样做。

3 个答案:

答案 0 :(得分:5)

您可以在SQL和/或存储过程中进行分页。

基本上,您将sproc传递给页面上的项目数以及您所在的页面。例如,每页第3页和第20页。

如果您可以使用SQL Server 2005或更高版本,则可以使用一些较新的关键字来简化查询。

以下是此类查询的简单版本:

SELECT ClientName, RowNumber
FROM (SELECT ClientName, ROW_NUMBER() OVER (ORDER BY ClientName) AS RowNumber
FROM Clients) AS cl
WHERE RowNumber BETWEEN 12 AND 30

您可以将“12”和“30”以上的值作为输入参数。

这样,您只返回要显示的行。

答案 1 :(得分:1)

您可以将数据源粘贴在会话中。

然后检查你的DataSource是否从会话中为空,然后去获取它。

这样,您只能获取一次数据,如果需要获取新数据(比如因为您更新了某些内容),只需清空保存数据源的会话变量。

修改

这是一个例子的一半尝试,(我的意思是我不打算如何更改页面,因为我假设你已经知道如何做到这一点)

protected void PageChanging(object sender, GridViewPageEventArgs e)
{
  if(Session["YourSessionVariableForData"] == null)
    Session["YourSessionVariableForData"] = YourDataCall();
  YourGridView.PageIndex = e.NewPageIndex;
  YourGridView.DataSource = ((YourDataType)Session["YourSessionVariableForData"]);
  YourGridView.DataBind();
}

答案 2 :(得分:0)

在存储过程中进行分页。请考虑使用ROW_NUMBER()函数。创建一个类,该类将调用存储过程并使用ObjectDataSource将其连接到网格。