【问题标题】:How to use PagedDataSource with SQL for paging?如何使用 PagedDataSource 和 SQL 进行分页?
【发布时间】:2011-11-23 12:18:18
【问题描述】:

我不明白,当您需要知道总行数才能使分页工作时,您如何只能从数据库中获取所需的行数。

我的意思是: 我按照这个例子: http://www.c-sharpcorner.com/uploadfile/rizwan328/datalist-custom-paging-in-Asp-Net-using-C-Sharp/

但是我有一个数据库,而不是使用数据表。

我是这样从数据库中获取新闻的,这会从我的新闻表中获取所有新闻:

List<News> news = News.GetNews();

public static List<News> GetNews(){
    List<News> news = new List<News>();
    using (SqlConnection conn = new SqlConnection(CONNSTRING)) {
            SqlCommand cmd = new SqlCommand("SELECT * FROM News_news ORDER BY date DESC", conn);

这会从所有新闻项目中获取所有数据。

然后我创建一个 PagedDataSource:

PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = news;
objPds.AllowPaging = true;
objPds.PageSize = numRows;
//Set the current page 
objPds.CurrentPageIndex = CurrentPage;

//Set the buttons

将数据放在一个重复器中,它将在 aspx 页面上显示前 5 个项目

repeater1.DataSource = objPds;
repeater1.DataBind(); 

像这样,我有一个分页的首页,显示总页数和当前页面,当我点击下一页的按钮时,我会重新做一遍。

但我知道这是不正确的,因为我总是得到所有的消息,然后丢弃我不需要的消息。但是请问,我需要怎么做才能只获得所需的新闻?

我需要先计算表中的行数吗?

【问题讨论】:

  • 您可能缺少 pageCount 属性初始化
  • 我不明白,我需要能够设置总页数,不是吗?根据数据源,它会创建总页数,难道不是您必须获取所有数据吗?

标签: c# asp.net sql database


【解决方案1】:

要使用PagedDataSource,查询过程中会返回所有记录,但可以使用持久化数据存储(Session和ViewState)来存储数据集,这样每次页面请求都不必再次打到数据库。

如果您只想撤回正在查看的页面的记录,据我所知,您将不得不推出自己的分页解决方案。不久前,我遇到了对自己的寻呼解决方案的需求,这是我提出的一个 SO 问题,它帮助我完成了我需要的工作,Paging choice, on database or in the web application

【讨论】:

    【解决方案2】:

    您可以通过将VirtualItemCount 设置为项目总数并将AllowCustomPaging 设置为true 来使用自定义分页。这样,您就可以从数据源中检索 PagedDataSource 在特定回发期间需要的那些记录集。

    【讨论】:

      【解决方案3】:

      您不需要特别知道 PagedDataSource 工作的结果数。给定 DataSource,它会为您解决这个问题。

      在上面的示例中,您没有专门设置PageSize,因此您需要添加

      objPds.PageSize = 5;
      

      不过,鉴于您的示例,您可能会考虑仅更改或添加到 GetNews 以将 TOP 添加到查询中,因为看起来您并不需要分页。您需要的只是前 5 个结果(或者至少,我是这么理解的)。

      public static List<News> GetNews(int Top){
          //OTher stuff here.
          SqlCommand cmd = new SqlCommand(String.Format("SELECT TOP {0} * FROM News_news ORDER BY date DESC", Top ), conn);
      }
      

      然后调用下面的,就可以彻底摆脱PagedDataSource了。

      List<News> news = News.GetNews(5);
      

      【讨论】:

      • objPds.PageSize = numRows; numRows 在开头定义为 5 ;) 问题是我知道如何获取前 5 个元素,甚至知道如何使用 row_numbers,但不知道如何使用 PagedDataSource 正确实现它,因为这需要元素的总量。所以我想知道如何正确实现 pagedDataSource,这样我就不必一直访问数据库。 objPds.DataSource 不接受 int 什么的,是吗?
      • @reaper_unique 我不敢相信我完全掩盖了这一点。我道歉。 DataSource 不会采用 int,不。它接受任何实现 IEnumerable 的东西。您必须在每次加载时重新加载 DataSource,并且每次加载页面时它必须是相同的 DataSource 才能使分页正常工作。如果您不想在每次加载时都访问数据库,则可以将数据保存在应用程序缓存中。
      猜你喜欢
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多