全面:玄龙戏珠无级树(五莲花姊妹兄弟完美自定义含图标)总结
/*筛选篇*/
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 测试九九表;
}