使用分页进行Telerik Radgrid控制

时间:2012-04-23 18:23:38

标签: asp.net telerik telerik-grid radgrid rad-controls

我在我的网站上使用RadGrid控件,我启用了radgrid的分页,我在sql profiler上监视它的活动,我知道radgrid为每个分页获取数据,然后显示当前页面的数据。

 DataSet obj_Dataset = new DataSet(); //  is global

这是我在Page_Load中写的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection obj_SqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConection"].ToString());
        SqlCommand obj_sqlCommand = new SqlCommand();
        obj_sqlCommand.CommandText = "select ProductID,ProductName,CategoryID from products";
        obj_sqlCommand.CommandType = CommandType.Text;
        obj_sqlCommand.Connection = obj_SqlConnection;

        SqlDataAdapter obj_DataAdapter = new SqlDataAdapter(obj_sqlCommand);
        obj_SqlConnection.Open();
        obj_DataAdapter.Fill(obj_Dataset, "Products");
        obj_DataAdapter.Dispose();
        obj_sqlCommand.Dispose();
        obj_SqlConnection.Close();
    }

这是我在RadGrid1_NeedDataSource上的代码:

 protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
    {

        RadGrid1.DataSource = obj_Dataset.Tables["Products"];

    }

我正在使用ASP.net 2010和Sqlserver 2008。

2 个答案:

答案 0 :(得分:2)

在RadGrid上实现分页时,每次更改页面时,它都只会检索当前页面所需的记录。这实际上是分页的好处之一。如果您希望它仅在第一次加载页面时获取数据,则必须在此后的每次回发中保留整个数据集。

我理解您希望最小化数据库连接,但如果您有足够的记录来要求分页,那么最好让分页按设计工作,而不是试图将整个数据集保存在服务器或ViewState中。也可能值得考虑为什么要避免使用数据库。太慢了吗?您可能希望优化数据库索引,评估结构或查看缓存。

但是,如果这是你真正想做的事情,并且你了解风险,你可以考虑使用Cache对象,如here所述。

例如:

protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
    var products = Cache["products"] as DataTable;
    if(products == null)
    {
       products = obj_Dataset.Tables["Products"];
       Cache.Insert("products", products , null, DateTime.Now.AddHours(6), TimeSpan.Zero);
    }

    RadGrid1.DataSource = products;
}

关于这种方法,您需要了解一些事项。首先,Cache对于应用程序是全局的,因此Cache中存储的数据对于每个用户必须相同。其次,Cache不会自动更新,因此如果您更新数据,则必须在代码中明确更新Cache。如果您有经常更改的数据,Cache不适合它。第三,Cache占用内存空间,因此如果您在其中存储大型数据集,您的应用程序将受到影响。

答案 1 :(得分:1)

我使用此存储过程来解决问题: 参数由radgrid属性填充:

     Create PROCEDURE  [dbo].[CastumPaging]
                    (
                       @SqlTableName nvarchar(100),
                       @OrderColumn nvarchar (30),
                       @Direction nvarchar(5),
                       @PageIndex int,
                       @PageSize int
                    )
                    AS
                    BEGIN
                    declare @SQLText nvarchar(500)

                     set @SQLText = 'SELECT * FROM (SELECT top 100 PERCENT * , ROW_NUMBER() 
                          OVER(ORDER BY '+@OrderColumn+' '+ @Direction + ' ) as RowNum 
                          FROM '+@SqlTableName+'  order by '+@OrderColumn+' '+@Direction +' )
                          as DerivedTableName WHERE RowNum BETWEEN '+
                          str(@PageIndex * @PageSize) +' AND'+ 
                          str((@PageIndex* @PageSize) +@PageSize -1) 

                    exec(@SQLText)
                    END