全面:玄龙戏珠无级树(五莲花姊妹兄弟完美自定义含图标)总结

全面:玄龙戏珠无级树(五莲花姊妹兄弟完美自定义含图标)总结

 

/*筛选篇*/
        private void 树开花()
        {
            树.Nodes.Clear(); string[] 重组表列 = null; List<int[,]> 图标序集 = new List<int[,]>();/* List<int[,]> 图标序集 = new List<int[,]>(new int[][,] { new int[,] { { 0, 16 } } });*/
            Func<DataTable> 数据表 = () => 加载数据(); DataTable 表 = 数据表.Invoke();
            if (表.TableName == "人员") { 重组表列 = new string[] { "归属", "姓名", "生日" }; 图标序集.Add(new int[,] { { 0, 16 }, { 5, 15 } }); }
            if (表.TableName == "提示") { 重组表列 = new string[] { "提示内容", "心情日记" }; 图标序集.Add(new int[,] { { 16, 18 } }); }
            if (表.TableName == "文摘") { 重组表列 = new string[] { "总类", "别类", "子类", "标题", "内容" }; 图标序集.Add(new int[,] { { 25, 21 } }); }
            this.Invoke(new Action(() =>
            {
                DataTable 树表 = 表.DefaultView.ToTable(true, 重组表列), 根表 = 树表.DefaultView.ToTable(true, 重组表列[0]);
                foreach (DataRow 数据列 in 根表.Rows)/*父龙*/
                {
                    Func<TreeNode, DataRow, int, List<int[,]>, TreeNode> 成节 = (上层节, 数据, 位置, 节图标序集) => 玄龙戏珠无级树(上层节, 数据, 位置, 节图标序集);
                    List<TreeNode> 子节 = new List<TreeNode>(), 节存 = new List<TreeNode>();
                    DateTime 日期; DataRow[] 子节数据 = null; TreeNode 节点 = new TreeNode();
                    if (表.TableName == "人员名称" && 图标序集.Count > 0) 图标序集[0][0, 0] = 0;/*条件自编*/
                    if (图标序集.Count > 0) { 节点.ImageIndex = 图标序集[0][0, 0]; 节点.SelectedImageIndex = 图标序集[0][0, 1]; }
                    节点.Text = 数据列[0].ToString(); 节点.Tag = 数据列;
                    树.Nodes.Add(节点); 子节.Add(节点);
                    if (!DateTime.TryParse(节点.Text, out 日期)) 子节数据 = 树表.Select(重组表列[0] + "='" + 节点.Text + "'");
                    foreach (DataRow 元素 in 子节数据)/*母龙=同步*/
                    {
                        for (int 级 = 1, 列数 = 重组表列.Length; 级 < 列数; 级++)/*子龙*/
                        {
                            bool 节控 = false; string 节路径 = "";
                            if (子节.Count < 列数) { 节点 = 成节(节点, 元素, 级, 图标序集); 子节.Add(节点); }/*龙珠*/
                            else
                            {
                                for (int 数 = 0; 数 <= 级; 数++) { if (节路径 == "") 节路径 = 元素[数].ToString(); else 节路径 += "\\" + 元素[数].ToString(); }
                                foreach (TreeNode 节数据 in 节存) { if (节路径 == 节数据.FullPath) { 子节[级] = 节数据; 节控 = false; break; } else 节控 = true; }
                                if (节路径 != 子节[级].FullPath || 节控)/*if (元素[级].ToString() != 子节[级].Text || 节控)*/
                                {
                                    节存.AddRange(子节); 节存 = 节存.Distinct().ToList(); 节存 = 节存.Where(筛选 => 筛选.Level < 列数 - 1).ToList();
                                    节点 = 成节(子节[级 - 1], 元素, 级, 图标序集); 子节[级] = 节点;
                                } } } } } }));
        }

        private TreeNode 玄龙戏珠无级树(TreeNode 节点, DataRow 子节, int 级, List<int[,]> 图标序集)
        {
            TreeNode 加子节 = new TreeNode();
            加子节.Tag = 子节; 加子节.Text = 子节[级].ToString();
            if (图标序集.Count > 0) { 加子节.ImageIndex = 图标序集[0][0,0]; 加子节.SelectedImageIndex = 图标序集[0][0,1]; }
            节点.Nodes.Add(加子节);
            return 加子节;
        }

        private void 加载树图标集()
        {
            ImageList 树图标集 = new ImageList();
            树图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\树图标集\\icolicious.ico"));
            树图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\树图标集\\观世音菩萨2.bmp"));
            树.ImageList = 树图标集;
        }
/*分组篇*/
        private void 树开花()
        {
            树.Nodes.Clear(); string[] 重组表列 = null; List<int[,]> 图标序集 = new List<int[,]>();/* List<int[,]> 图标序集 = new List<int[,]>(new int[][,] { new int[,] { { 0, 16 } } });*/
            Func<DataTable> 数据表 = () => 加载数据(); DataTable 表 = 数据表.Invoke();
            if (表.TableName == "人员") { 重组表列 = new string[] { "归属", "姓名", "生日" }; 图标序集.Add(new int[,] { { 0, 16 }, { 5, 15 } }); }
            if (表.TableName == "提示") { 重组表列 = new string[] { "提示内容", "心情日记" }; 图标序集.Add(new int[,] { { 16, 18 } }); }
            if (表.TableName == "文摘") { 重组表列 = new string[] { "总类", "别类", "子类", "标题", "内容" }; 图标序集.Add(new int[,] { { 25, 21 } }); }
            this.Invoke(new Action(() =>
            {
                DataTable 树表 = 表.DefaultView.ToTable(true, 重组表列), 根表 = 树表.DefaultView.ToTable(true, 重组表列[0]);
                foreach (DataRow 数据列 in 根表.Rows)/*父龙*/
                {
                    Func<TreeNode, DataRow, int, List<int[,]>, TreeNode> 成节 = (上层节, 数据, 位置, 节图标序集) => 玄龙戏珠无级树(上层节, 数据, 位置, 节图标序集);
                    List<TreeNode> 子节 = new List<TreeNode>(); List<TreeNode>[] 节存 = new List<TreeNode>[重组表列.Length - 2]; for (int 级 = 0, 列数 = 重组表列.Length - 2; 级 < 列数; 级++) { 节存[级] = new List<TreeNode>(); }
                    DateTime 日期; DataRow[] 子节数据 = null; TreeNode 节点 = new TreeNode();
                    if (表.TableName == "人员名称" && 图标序集.Count > 0) 图标序集[0][0, 0] = 0;/*条件自编*/
                    if (图标序集.Count > 0) { 节点.ImageIndex = 图标序集[0][0, 0]; 节点.SelectedImageIndex = 图标序集[0][0, 1]; }
                    节点.Text = 数据列[0].ToString(); 节点.Tag = 数据列;
                    树.Nodes.Add(节点); 子节.Add(节点);
                    if (!DateTime.TryParse(节点.Text, out 日期)) 子节数据 = 树表.Select(重组表列[0] + "='" + 节点.Text + "'");
                    foreach (DataRow 元素 in 子节数据)/*母龙=同步*/
                    {
                        for (int 级 = 1, 列数 = 重组表列.Length; 级 < 列数; 级++)/*子龙*/
                        {
                            bool 节控 = false; string 节路径 = "";
                            if (子节.Count < 列数) { 节点 = 成节.Invoke(节点, 元素, 级, 图标序集); 子节.Add(节点); if (级 < 列数 - 1) 节存[级 - 1].Add(子节[级]); }/*龙珠*/
                            else
                            {
                                for (int 数 = 0; 数 <= 级; 数++) { if (节路径 == "") 节路径 = 元素[数].ToString(); else 节路径 += "\\" + 元素[数].ToString(); }
                                if (级 < 列数 - 1) foreach (TreeNode 节数据 in 节存[级 - 1]) { if (节路径 == 节数据.FullPath) { 子节[级] = 节数据; 节控 = false; break; } else 节控 = true; }
                                if (节路径 != 子节[级].FullPath || 节控)
                                {
                                    节点 = 成节.Invoke(子节[级 - 1], 元素, 级, 图标序集); 子节[级] = 节点;
                                    if (级 < 列数 - 1)
                                    {
                                        节存[级 - 1].Add(子节[级]); 节存[级 - 1] = 节存[级 - 1].Distinct().ToList();
                                        节存[级 - 1] = 节存[级 - 1].Where(筛选 => 筛选.Level < 列数 - 1).ToList();
                                    }
                                } } } } } }));
        }
/*核心篇分类分组=推荐*/
        private void 玄龙戏珠无级树()/*之前写的用筛选已经舍弃,采用构思设计核心实现,同时采用分类分组提高运行速度,生树受影响主要在读数据到表部分.*/
        {
            this.Invoke(new Action(() =>
            {
                ImageList 图标集 = new ImageList();/*设置与初始化*/
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\icolicious.ico"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\观世音菩萨2.bmp"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\sucaiwcom-1240000qj.gif"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\sucaiwcom-1930000pf.gif"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\Illustrator 10.ico"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\狮子吼.ico"));
                树.ImageList = 图标集; 树.Nodes.Clear();
                DataTable 树表 = null; string[] 重组表列 = null;
                Func<DataTable> 数据表 = () => 加载数据(); DataTable 表 = 数据表();/*调用vs2010版数据控件自动生成读取数据库到表方法(无参返回值)*/

                if (表.TableName == "人员") 重组表列 = new string[] { "归属", "姓名", "生日" };
                if (表.TableName == "提示") 重组表列 = new string[] { "提示内容", "心情日记" };
                if (表.TableName == "文摘") 重组表列 = new string[] { "总类", "别类", "子类", "标题", "内容" };
                List<TreeNode> 子节 = new List<TreeNode>(); 子节.Add(new TreeNode()); int 列数 = 重组表列.Length; List<TreeNode>[] 节存 = new List<TreeNode>[列数 - 1];
                for (int 级 = 0; 级 != 列数 - 1; 级++) { 节存[级] = new List<TreeNode>(); 子节.Add(new TreeNode()); }
                树表 = 表.DefaultView.ToTable(true, 重组表列);
                /*玄龙戏珠无级树=>开始*/
                foreach (DataRow 数据列 in 树表.Rows)
                {
                    bool 节控 = false;
                    for (int 级 = 0; 级 != 列数; 级++)
                    {
                        string 节路径 = "";
                        if (树.Nodes.Count == 0) 节控 = true;
                        for (int 数 = 0; 数 <= 级; 数++) { if (节路径 == "") 节路径 = 数据列[数].ToString(); else 节路径 += "\\" + 数据列[数].ToString(); }
                        if (级 < 列数 - 1) foreach (TreeNode 节数据 in 节存[级]) { if (节路径 == 节数据.FullPath) { 子节[级] = 节数据; 节控 = false; break; } else 节控 = true; } else 节控 = true;
                        if (节控 && 级 == 0)
                        {
                            TreeNode 节点 = new TreeNode();
                            节点.Tag = 数据列; 节点.Text = 数据列[0].ToString();
                            节点.ImageIndex = 3; 节点.SelectedImageIndex = 2;/*图标按条件自编*/
                            节存[级].Add(节点); 子节[级] = 节点;
                            树.Nodes.Add(节点);
                        }
                        if (级 > 0 && 节控)
                        {
                            TreeNode 加子节 = new TreeNode();
                            加子节.Tag = 数据列; 加子节.Text = 数据列[级].ToString();
                            加子节.ImageIndex = 4; 加子节.SelectedImageIndex = 5;/*图标按条件自编*/
                            if (级 < 列数 - 1) 节存[级].Add(加子节); 子节[级] = 加子节; 子节[级 - 1].Nodes.Add(加子节);
                        }
                        if (级 < 列数 - 1) 节存[级] = 节存[级].Distinct().ToList();
                    }
                }
            }));
        }
/*核心篇*/
        private void 玄龙戏珠无级树()/*构思设计核心实现,所以发布纯粹给有兴趣研究代码多种写法的人作参考.*/
        {
            this.Invoke(new Action(() =>
            {
                ImageList 图标集 = new ImageList();/*设置与初始化*/
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\icolicious.ico"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\观世音菩萨2.bmp"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\sucaiwcom-1240000qj.gif"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\sucaiwcom-1930000pf.gif"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\Illustrator 10.ico"));
                图标集.Images.Add(Image.FromFile(@System.Environment.CurrentDirectory + "\\ICO\\狮子吼.ico"));
                树.ImageList = 图标集; 树.Nodes.Clear();
                DataTable 树表 = null; string[] 重组表列 = null;
                Func<DataTable> 数据表 = () => 加载数据(); DataTable 表 = 数据表();
                if (表.TableName == "人员") 重组表列 = new string[] { "归属", "姓名", "生日" };
                if (表.TableName == "提示") 重组表列 = new string[] { "提示内容", "心情日记" };
                if (表.TableName == "文摘") 重组表列 = new string[] { "总类", "别类", "子类", "标题", "内容" };
                List<TreeNode> 子节 = new List<TreeNode>(), 节存 = new List<TreeNode>(); int 列数 = 重组表列.Length;
                树表 = 表.DefaultView.ToTable(true, 重组表列);
                /*玄龙戏珠无级树=>开始*/
                foreach (DataRow 数据列 in 树表.Rows)
                {
                    bool 节控 = false;
                    for (int 级 = 0; 级 != 列数; 级++)
                    {
                        string 节路径 = "";
                        if (树.Nodes.Count == 0) 节控 = true;
                        for (int 数 = 0; 数 <= 级; 数++) { if (节路径 == "") 节路径 = 数据列[数].ToString(); else 节路径 += "\\" + 数据列[数].ToString(); }
                        if (级 < 列数 - 1) foreach (TreeNode 节数据 in 节存) { if (节路径 == 节数据.FullPath) { 子节[级] = 节数据; 节控 = false; break; } else 节控 = true; } else 节控 = true;
                        if (节控 && 级 == 0)
                        {
                            TreeNode 节点 = new TreeNode(); 子节.Add(节点);
                            节点.Tag = 数据列; 节点.Text = 数据列[0].ToString();
                            节点.ImageIndex = 3; 节点.SelectedImageIndex = 2;
                            节存.Add(节点); 子节[级] = 节点;
                            树.Nodes.Add(节点);
                        }
                        if (级 > 0 && 节控)
                        {
                            TreeNode 加子节 = new TreeNode(); 子节.Add(加子节);
                            加子节.Tag = 数据列; 加子节.Text = 数据列[级].ToString();
                            加子节.ImageIndex = 4; 加子节.SelectedImageIndex = 5;
                            if (级 < 列数 - 1) 节存.AddRange(子节); 子节[级] = 加子节;
                            子节[级 - 1].Nodes.Add(加子节);
                        }
                        if (级 < 列数 - 1) { 节存 = 节存.Distinct().ToList(); 节存 = 节存.Where(筛选 => 筛选.Level < 列数 - 1).ToList(); }
                    }
                }
            }));
        }


        private DataTable 测试九九表树()
        {
            /*创建测试九九表、设置表名、列名*/
            DataTable 测试九九表 = new DataTable(); 测试九九表.TableName = "测试树表"; 测试九九表.Columns.Add("九九表");
            for (int 表头序 = 1; 表头序 <= 9; 表头序++) { 测试九九表.Columns.Add(表头序.ToString()); }
            /*添加行数据*/
            for (int i = 1; i <= 9; i++)
            {
                DataRow 测试树表列 = 测试九九表.NewRow(); 测试树表列[0] = "九九表";
                for (int j = 1; j <= 9; j++)
                { 测试树表列[j] = i.ToString() + "×" + j.ToString() + "=" + (i * j).ToString(); }
                测试九九表.Rows.Add(测试树表列);
            }
            return 测试九九表;
        }


猜你喜欢

转载自blog.csdn.net/xianfajushi/article/details/7756584