2011-12-27 3 views
1

ここでソートを行い、最新のエントリを最初に表示しようとしています。私はpagedDataSourceにバインドされたリピータコントロールを持っています。私のソートは、コレクション全体ではなくページワイズでしか動作しません。ここページ単位のリピータコントロール内の現在のページでのみ日付でソート

私のコードが背後にある:

private int RowCount 
    { 
     get 
     { 
      return (int)ViewState["RowCount"]; 
     } 
     set 
     { 
      ViewState["RowCount"] = value; 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

     if (!IsPostBack) 
     { 
      FetchData(5, 0);      
     } 
     else 
     { 
      plcPaging.Controls.Clear(); 
      CreatePagingControl(); 
     } 

    } 

    private void FetchData(int take, int pageSize) 
    { 
     using (krystaladbDataContext db = new krystaladbDataContext()) 
     { 
      var query = from q in db.question_tables 

         .Take(take) 
         .Skip(pageSize) 

         orderby q.QUEST_POSTED_DATE descending 
         select new 
         { 


          QUEST_ID = q.QUEST_ID, 
          QUEST_TEXT = q.QUEST_TEXT, 
          QUEST_POSTED_DATE = q.QUEST_POSTED_DATE, 
          QUEST_USR_ID = q.QUEST_USR_ID, 
          QUEST_LIKES_COUNT = q.QUEST_LIKES_COUNT, 
          QUEST_REPORT_COUNT = q.QUEST_REPORT_COUNT, 
          Count = db.question_tables.Count() 

         }; 




      PagedDataSource page = new PagedDataSource(); 
      page.AllowCustomPaging = true; 
      page.AllowPaging = true; 
      page.DataSource = query; 
      page.PageSize = 5; 
      QRep.DataSource = page; 
      QRep.DataBind(); 

      if (!IsPostBack) 
      { 
       RowCount = query.First().Count; 
       CreatePagingControl(); 

      } 
     } 
    } 

    private void CreatePagingControl() 
    { 
     for (int i = 0; i < (RowCount/5) + 1; i++) 
     { 
      LinkButton lnk = new LinkButton(); 
      lnk.Click += new EventHandler(lbl_Click); 
      lnk.ID = "lnkPage" + (i + 1).ToString(); 
      lnk.Text = (i + 1).ToString(); 
      plcPaging.Controls.Add(lnk); 
      Label spacer = new Label(); 
      spacer.Text = "&nbsp;"; 
      plcPaging.Controls.Add(spacer); 
     } 

    } 

EDITは::私が欲しいページコントロールのイベントハンドラ

void lbl_Click(object sender, EventArgs e) 
    { 
     LinkButton lnk = sender as LinkButton; 
     int currentPage = int.Parse(lnk.Text); 
     int take = currentPage * 5; 
     int skip = currentPage == 1 ? 0 : take - 5; 
     FetchData(take, skip); 
    } 

を含めすべてにわたってソート作業を持っている基本的です1つのページではなくページを表示します。正しい方向の人に私を指差してください。ありがとう

+2

.Take/.Skipの前に注文することはできますか?私がそれを読んでいるところでは、レコードのページを取り出し、それをソートしています。 – Sam

+0

サム、それはできません、構文エラー –

答えて

1

テイクの前に注文してください。

var query = from q in db.question_tables 
      orderby q.QUEST_POSTED_DATE descending 
      select new 
      { 
       QUEST_ID = q.QUEST_ID, 
       QUEST_TEXT = q.QUEST_TEXT, 
       QUEST_POSTED_DATE = q.QUEST_POSTED_DATE, 
       QUEST_USR_ID = q.QUEST_USR_ID, 
       QUEST_LIKES_COUNT = q.QUEST_LIKES_COUNT, 
       QUEST_REPORT_COUNT = q.QUEST_REPORT_COUNT, 
       Count = db.question_tables.Count() 
      } 
      .Take(take) 
      .Skip(pageSize); 

あなたは代わりに次にページング制御に.Take

前にLINQ .OrderByメソッドを使用することができます。

void lbl_Click(object sender, EventArgs e) 
{ 
    LinkButton lnk = sender as LinkButton; 
    int currentPage = int.Parse(lnk.Text); 
    int take = page.PageSize; 
    int skip = page.PageSize * (currentPage - 1); 
    FetchData(take, skip); 
} 
+0

ありがとう、しかし、これはすべてのページ上のデータ項目の同じセットを提供します。 –

+0

5,0のページロードでFetchData(5,0)を呼び出すだけで、スキップされないため最初の5つのレコードが取得されます。いくつかのページがあるときに呼び出す必要があり、ページに基づいて新しいパラメータを渡す必要があります。 –

+0

私は、ページコントロールのイベントハンドラを含めるように質問を編集しました。再度確認できますか?ありがとう –

関連する問題