在NET里用XML作为数据源进行分页

by shinichi_wtn 2008-09-02 15:18

.NET自带的数据显示控件GridView自带分页功能,但是要实现分页功能必须使用指定的数据源,而一旦指定XMLDataSource数据源,即使加上XPath也很难满足我们查询分类的需要,因此需要使用自己得到数据进行绑定,而这些数据来自XML文件.下面我在博客系统中编制了一个和百度空间类似的分页功能.

在实现该功能的时候,遇到三个问题,第一个问题是在同一个页面获取不同的分类参数显示不同的分类文章,比如传递的是时间"08年8月",则08年8月的文章就被显示出来;或者传递的是类型"个人日记",则划分到个人日记类的文章全部被显示出来,由于分类标准只有4个,我就只选择了IF嵌套,如果标准再多,则应使用CASE分类;第二个问题就是XmlNodeList是只读文件,不能新建和修改,因此假如我们要获取一个XmlNodeList里的部分节点,则需要对其进行转换,简单的方法是新建一个XmlNode数组,把XmlNodeList里的元素引用到XmlNode数组里,则可以对XmlNodeList进行筛选.而得到的XmlNode数组正是我们需要的数据源;第三个问题就是核心的分页问题,具体思想见代码

显示效果如下:

部分代码如下:

//分页函数,采用10个HyperLink空间动态操作页码
public XmlNode[] wtnpaging(XmlNodeList nodes)
{
    int pe = 5;//每页显示的文章数
    string p = Request.QueryString["p"].ToString();
    int n = nodes.Count;
    int b = (Int32.Parse(p) - 1) * pe;
    HyperLink[] hl = new HyperLink[10];
    hl[0] = HyperLink1;
    hl[1] = HyperLink2;
    hl[2] = HyperLink3;
    hl[3] = HyperLink4;
    hl[4] = HyperLink5;
    hl[5] = HyperLink6;
    hl[6] = HyperLink7;
    hl[7] = HyperLink8;
    hl[8] = HyperLink9;
    hl[9] = HyperLink10;
    if (n > pe)//判断文章总数是否大于每页显示的文章数,如果是,则分页,否则不出现页码提示
    {
        fisrtpage.Visible = true;
        lastpage.Visible = true;
        int page = (n - 1) / pe;
        page++;
        string u = Request.Url.ToString();
        u = u.Substring(0, u.IndexOf("p="));
        fisrtpage.NavigateUrl = u + "p=1";
        lastpage.NavigateUrl = u + "p=" + page;
        if (page <= 10)//判断页码总数是否小于10,如果是,则显示全部页码,否则分批显示
        {
            for (int i = 0; i < page; i++)
            {
                hl[i].Visible = true;
                hl[i].NavigateUrl = u + "p=" + (i + 1).ToString();
            }
            hl[Int32.Parse(p) - 1].Text = p;
            hl[Int32.Parse(p) - 1].Enabled = false;
        }
        else if (page - Int32.Parse(p) < 4)//判断当前页码与页码总数之差
        {
            int n1 = Int32.Parse(p) - 4;
            for (int i = 0; i < page - n1 + 1; i++)
            {
                hl[i].Visible = true;
                hl[i].Text = "[" + (i + n1).ToString() + "]";
                hl[i].NavigateUrl = u + "p=" + (i + n1).ToString();
            }
            hl[4].Text = p;
            hl[4].Enabled = false;
        }
        else
        {
            int n1 = Int32.Parse(p) - 4;//如果是前4页,则不改变页码编号,否则移动页码,使得当前页码之前有4个页码,方便快速移动
            if (n1 <= 0)
            {
                for (int i = 0; i < 10; i++)
                {
                    hl[i].Visible = true;
                    hl[i].Text = "[" + (i + 1).ToString() + "]";
                    hl[i].NavigateUrl = u + "p=" + (i + 1).ToString();
                }
                hl[n1 + 3].Text = p;
                hl[n1 + 3].Enabled = false;
            }
            else
            {
                for (int i = 0; i < 10; i++)
                {
                    hl[i].Visible = true;
                    hl[i].Text = "[" + (i + n1).ToString() + "]";
                    hl[i].NavigateUrl = u + "p=" + (i + n1).ToString();
                }
                hl[Int32.Parse(p) - n1].Text = p;
                hl[Int32.Parse(p) - n1].Enabled = false;
            }
        }
    }
    int m = (n - b > pe) ? pe : n - b;
    XmlNode[] x = new XmlNode[m];
    for (int i = 0; i < m; i++)
        x[i] = nodes[b + i];
    return x;
}
//IF嵌套实现多个分类在同一页面实现
protected void Page_Load(object sender, EventArgs e)
{
    info.Visible = false;
    string s;
    string q;
    if (Request.QueryString["p"] == null)
    {
        Response.Redirect(Request.Url.ToString() + "&p=1");
    }
    if (Request.QueryString["cata"] == null)
    {
        if (Request.QueryString["author"] == null)
        {
            if (Request.QueryString["date"] == null)
            {
                if (Request.QueryString["range"] == null)
                {
                    Response.Redirect("blog.aspx?page=1");
                }
                else
                {
                    q = Request.QueryString["range"].ToString();
                    s = "/article/art/a[@t='" + q + "']";
                    databind(s);
                    info.Text = " (你正在浏览 " + q + " 这个月的文章)";
                }
            }
            else
            {
                //按发表时间分类
                q = Request.QueryString["date"].ToString();
                s = "/article/art/a[date='" + q + "']";
                databind(s);
                info.Text = " (你正在浏览 " + q + " 这天的文章)";
            }
        }
        else
        {
            //按发表作者分类
            q = Request.QueryString["author"].ToString();
            s = "/article/art/a[author='" + q + "']";
            databind(s);
            info.Text = " (你正在浏览 " + q + " 发表的文章)";
        }

    }
    else
    {
        //按文章类型分类
        q = Request.QueryString["cata"].ToString();
        s = "/article/art/a[catalog='" + q + "']";
        databind(s);
        info.Text = " (你正在浏览 " + q + " 里的文章)";
    }

}
//数据绑定
public void databind(string xpath)
{
    XmlDocument anling = new XmlDocument();
    anling.Load(Server.MapPath(".\\admin\\article.xml"));
    XmlNodeList nodes = anling.SelectNodes(xpath);
    GridView1.DataSource = wtnpaging(nodes);
    GridView1.DataBind();
    info.Visible = true;
}
//部分HTML代码
<span class="pager">
<asp:HyperLink ID="fisrtpage" runat="server" Visible="false">首页</asp:HyperLink>&nbsp;&nbsp;
<asp:HyperLink ID="HyperLink1" runat="server" Text="[1]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink2" runat="server" Text="[2]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink3" runat="server" Text="[3]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink4" runat="server" Text="[4]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink5" runat="server" Text="[5]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink6" runat="server" Text="[6]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink7" runat="server" Text="[7]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink8" runat="server" Text="[8]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink9" runat="server" Text="[9]" Visible="false"></asp:HyperLink>
<asp:HyperLink ID="HyperLink10" runat="server" Text="[10]" Visible="false"></asp:HyperLink>&nbsp;&nbsp;
<asp:HyperLink ID="lastpage" runat="server" Visible="false">末页</asp:HyperLink>
</span>

(仅用于Gavatar)

  Country flag

biuquote
  • Comment
  • Preview
Loading

About

shinichi_wtnI'm Shinichi_wtn

Software Engineering Manager at Microsoft

[More...]


Month List