一定规则的字符串生成树结构

来源:互联网 发布:上帝之城奥古斯丁知乎 编辑:程序博客网 时间:2024/06/05 15:36
     最近做项目要在winform下做个多表头的报表,而C#下的datagridview不象可以简单的通过重构表头来实现。所以只好自己重写datagridview控件的表头,而从网上查了一点资料,可以通过重写表头来实现。有一个是用树来表示表头的,由于我的表头的列很多,如果手工一行一行的添加结点,重复代码量很多,于是自己根据一定规则的字条串来生成一个树,
代码:(C#)
主函数
     public TreeView CreaterTree(string strHeader)
        {
            TreeView treeTemp = new TreeView();
            treeTemp.Nodes.Add("root");
            CreateTreeSubNode(treeTemp, strHeader, 0);
            return treeTemp;
        }
//递归生成子结点
        protected void CreateTreeSubNode(TreeView treeParent, string strHeader, int intLevel)
        {
            if (strHeader == "")
            {
                return;
            }
            TreeNode treeNow = treeParent.Nodes[0];
//找观察家当前结点的父结点
            for (int i = 0; i < intLevel; i++)
            {
                treeNow = treeNow.Nodes[treeNow.Nodes.Count - 1];
            }
            int intRoot = 0;
            int intParent = 0;
            int intMin = 0;
            string strNowNodeName = "";
            string strLastName = "";
            intRoot = strHeader.IndexOf('[');
            intParent = strHeader.IndexOf(']');

            if (intRoot == -1)
            {
                intRoot = int.MaxValue;
            }
            if (intParent == -1)
            {
                intParent = int.MaxValue;
            }

            intMin = Math.Min(intRoot, intParent);
            if (intMin == int.MaxValue)
            {
                //最后一个结点
                strNowNodeName = strHeader.TrimEnd(']');
                strNowNodeName = strNowNodeName.TrimStart(',');
                strLastName = "";
            }
            else
            {
                strNowNodeName = strHeader.Substring(0, intMin);
                strLastName = strHeader.Substring(intMin + 1);
                if (intRoot == intMin)
                {
                    //当前结点为根结点
                    intLevel++;
                }
                else if (intParent == intMin)
                {
                    intLevel--;
                }
            }
            string[] strTree = strNowNodeName.TrimStart(',').TrimEnd(',').Split(',');
            foreach (string strnode in strTree)
            {
                if (strnode != "")
                {
                    treeNow.Nodes.Add(strnode);
                }
            }
            CreateTreeSubNode(treeParent, strLastName, intLevel);
        }
树型结构字符串为:strHeader="结一[结一一,结一二],结点二[结点一二,结点二二],结点3,结点4"
调用方法:CreaterTree(strHeader)
生成的树结构相信大家一看就知道了。

原创粉丝点击