【问题标题】:use paging for Telerik Rad grid contorl对 Telerik Radgrid 控件使用分页
【发布时间】:2012-04-23 18:23:37
【问题描述】:

我在我的网站上使用 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。

【问题讨论】:

  • 我的代码错了吗?为什么每次我更改页面时它都会从数据库中读取数据。
  • 我可以做一些事情,让 radgrid 读取一次数据并每次都使用它。
  • 我使用 "Session["Cone"] = (DataSet)obj_Dataset;"在页面加载。并阅读“obj_Dataset = (DataSet)Session["Cone"];"在 RadGrid1_NeedDataSource 上,我解决了问题。但我认为这不是一个好方法,因为我正在使用服务器内存,这可能非常糟糕。有没有更好的方法?
  • 使用 session 绝对不是推荐的方式来做你正在做的事情。看我的回答。 :)

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


【解决方案1】:

当您在 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 占用内存空间,所以如果你在其中存储大量数据集,你的应用程序会受到影响。

【讨论】:

  • 你是对的,当我们有很多记录时分页和它非常好。但是当网格页面更改时,分析器向我显示一个 Tsql,我知道它的所有数据而不是当前页面记录。我认为它会传输页面上的所有数据,然后显示当前页面记录。(对于每个页面分析器显示“从产品中选择 *”)
【解决方案2】:

我使用这个存储过程来解决这个问题: 参数由 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多