0

我想在转发器控制中进行分页。我使用 xml 作为带有 linq 的数据库。所以请给我建议如何做到这一点。我尝试了这段代码,但它不起作用

    public 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
        {
            PlaceHolder1.Controls.Clear();
            CreatePagingControl();
        }

    }

    private void FetchData(int take,int pagesize)
    {
        var doc = XDocument.Load(Server.MapPath("~/BlogContent.xml"));
        var result = doc.Descendants("post").Where(x => x.Element("id") != null).Take(take).Skip(pageSize)
        .Select(x => new
        {
            id = x.Element("id").Value,
            title = x.Element("title").Value,
            Description = x.Element("Discription").Value,
            dt = x.Element("dt").Value,
            mnt = x.Element("mnt").Value,
            yr = x.Element("yr").Value,
            postdate = x.Element("PostDate").Value
        }).OrderByDescending(x => x.id);

        PagedDataSource page = new PagedDataSource();
        page.AllowPaging = true;
        page.AllowCustomPaging = true;
        page.DataSource = result;
        page.PageSize = 10;
        if (!IsPostBack)
        {
            RowCount = result.Count();

        }





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


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


    }

当我使用此代码时,上一个和下一个按钮正在工作,但中继器上的数据没有改变

4

1 回答 1

0

看一下 :

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

您的意思是,您将显示 10 倍于当前页数的行数。例如,如果您在第 4 页,您将显示 40 行,而在第 5 页,您将显示 50 行。

然后您指定要跳过的行数,因此在第一页中您将不跳过任何行,但在第 4 页中您将跳过 40 - 10 = 30 行。您应该做的是始终采用一组预定义的行,即 10,然后将 skip 作为变量。

例如,您应该将代码设置为:

void lbl_click(object sender, EventArgs e)
{
    LinkButton lnk = sender as LinkButton;
    int currentPage = int.Parse(lnk.Text);
    int take = 10;
    int skip = (currentPage - 1) * 10;
    FetchData(take, skip);  
}

在第 1 页中,您将跳过 0 行,在第 2 页中,您将跳过 10 行等。

您甚至可以考虑在用户定义的变量中包含取数...

编辑

您还应该检查您的 Page_Load

protected void Page_Load(object sender, EventArgs e)
{

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

}

在数据的初始加载中,您取前五行并跳过 0。如果将其更改为

FetchData(10, 0);

你应该没事。

扬尼斯

于 2013-07-15T09:20:17.997 回答