寻呼与中继器

时间:2013-07-15 08:26:05

标签: asp.net xml linq

我想在转发器控制中进行分页。我使用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);


    }

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

1 个答案:

答案 0 :(得分: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);

你应该没事。

Giannis