XML实现分页

来源:互联网 发布:tensorflow离线安装包 编辑:程序博客网 时间:2024/06/07 07:39

这次按要求做一个提供地图软件更新版本的WEB端,应为用户不多,设计的都是文本操作,所以不让用数据库了,列表分页的地方只好用XML来实现

public class XmlPage
    
{
        
private int _nowPage;
        
private int _pageSize;
        
private int _recordCount;
        
private int _pageCount;

        
public int NowPage get return _nowPage; } set { _nowPage = value; } }
        
public int PageSize get return _pageSize; } set { _pageSize = value; } }
        
public int RecordCount get return _recordCount; } set { _recordCount = value; } }
        
public int PageCount get return _pageCount; } set { _pageCount = value; } }

        
public XmlPage() { }

        
public DataTable GetData(string filePath, string xPathToNodes, PageModelBy model)
        
{
            XmlDocument xdoc 
= new XmlDocument();
            
try
            
{
                xdoc.Load(filePath);
            }

            
catch (XmlException)
            
{
                
throw new Exception("错误的数据路径");
            }

            XmlElement root 
= xdoc.DocumentElement;
            XmlNodeList nodeList; 
//存储符合条件的数据
            _recordCount = root.ChildNodes.Count;

            
if (_pageSize > 0)
            
{
                
if (_recordCount % _pageSize == 0)
                
{
                    _pageCount 
= _recordCount / _pageSize;
                }

                
else
                
{
                    _pageCount 
= _recordCount / _pageSize + 1;
                }

            }

            
else
            
{
                _pageCount 
= 1;
            }


            
if (_nowPage < 1)
            
{
                _nowPage 
= 1;
            }

            
else if (_nowPage > _pageCount)
            
{
                _nowPage 
= _pageCount;
            }


            
if (_nowPage == 1)
            
{
                
if (_pageSize == 0)
                
{
                    nodeList 
= xdoc.SelectNodes(xPathToNodes);
                }

                
else
                
{
                    nodeList 
= xdoc.SelectNodes(xPathToNodes+"[position()<=" + _pageSize + "]");
                }

            }

            
else
            
{
                
if (_nowPage > 1)
                
{
                    
int startIndex = (_nowPage-1* _pageSize+1;
                    
int endIndex = startIndex + _pageSize-1;
                    nodeList 
= xdoc.SelectNodes(xPathToNodes+"[position()>=" + startIndex.ToString() + " and position()<="+endIndex.ToString()+"]");
                }

                
else
                
{
                    nodeList 
= xdoc.SelectNodes(xPathToNodes);
                }

            }


            
if (nodeList.Count>0)
            
{
                
using (DataTable dt = new DataTable())
                
{
                    
if (model == PageModelBy.Element) //以子节点左右分页列
                    {
                        
if (nodeList.Item(0).HasChildNodes)
                        
{
                            
foreach (XmlNode xnode in nodeList.Item(0).ChildNodes) // 创建表结构
                            {
                                dt.Columns.Add(xnode.Name, 
typeof(string));
                            }


                            
foreach (XmlNode xnode in nodeList) // 填充数据
                            {
                                DataRow dr 
= dt.NewRow();
                                
for (int i = 0; i < xnode.ChildNodes.Count; i++)
                                
{
                                    
if (xnode.ChildNodes.Item(i).InnerText != null)
                                    
{
                                        dr[i] 
= xnode.ChildNodes.Item(i).InnerText;
                                    }

                                }

                                dt.Rows.Add(dr);
                            }

                        }

                    }


                    
if (model == PageModelBy.Attribute)// 以元素作为分页列
                    {
                        
if (nodeList.Item(0).Attributes.Count != 0)
                        
{
                            
foreach (XmlAttribute xAtt in nodeList.Item(0).Attributes) // 创建表结构
                            {
                                dt.Columns.Add(xAtt.Name, 
typeof(string));
                            }


                            
foreach (XmlNode xnode in nodeList) // 填充数据
                            {
                                DataRow dr 
= dt.NewRow();
                                
for (int i = 0; i < xnode.Attributes.Count; i++)
                                
{
                                    dr[i] 
= xnode.Attributes[i].Value;
                                }

                                dt.Rows.Add(dr);
                            }

                        }

                    }

                    
return dt;
                }

            }

            
else
            
{
                
return new DataTable();
            }

        }


        
public enum PageModelBy
        

            Element,
            Attribute
        }

    }

===============================================
前台调用

我都习惯用返回DataTable数据绑定到Repeater
其实也可以直接返回符合页面条件的XML节点,然后用xslt来显示,这样就把XmlPage里面构建DataTable部分删除就可以了直接返回NodeList

        private void BindPage(int nowPage)
        
{
            
//分页
      XmlPage myPage = new XmlPage();
            myPage.NowPage 
= nowPage;
            myPage.PageSize 
= 25;
            
using (DataTable dt = myPage.GetData(BLL.Version.filePath, "/updateinfos/updateinfo/general", XmlPage.PageModelBy.Element))
            
{
                VersionList.DataSource 
= dt; //VersionList是Repeat控件ID
            }


            
//分页数据绑定
      prePage = (myPage.NowPage - 1).ToString();
            nextPage 
= (myPage.NowPage + 1).ToString();
            lastPage 
= myPage.PageCount.ToString();
            nowPage 
= myPage.NowPage.ToString();
            allPages 
= myPage.PageCount.ToString();
            allRecords 
= myPage.RecordCount.ToString();
            perPageRecords 
= myPage.PageSize.ToString();

            Page.DataBind();
       }

这个分页临时写的,这次的应用不复杂,有些情况可能会BUG,下次再修改一下