Сортировать по дате, работает только для текущей страницы, внутри постраничного повторителя - PullRequest
1 голос
/ 28 декабря 2011

Я пытаюсь сделать сортировку, чтобы сначала отображать последние записи. У меня есть элемент управления повторителем, который привязан к 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 Ответ

1 голос
/ 28 декабря 2011

Выполните заказ до получения.

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);

В качестве альтернативы вы можете использовать метод linq .OrderBy перед .Take

Затем на подкачкуконтроль.

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);
}
...