作者: littleboy 2023-10-14 16:09:22

C#treeview操作

参考:

设计层级树结构:Sw_Function: SW-API-功能开发和测试 - Gitee.com

3级分类树结构:Sw_Function: SW-API-功能开发和测试 - Gitee.com

生成

原始数据:”分类表.txt”

1
2
3
4
5
6
标准件,1,1,1,
标准件,气动元件,,,
标准件,气动元件,气缸,,
标准件,气动元件,气缸,SMC,
标准件,机械传动件,,,
标准件,机械传动件,轴承,,

转换成treeview

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private void TreeView_show()//读取分类列表+显示树结构
{
//读取分类列表
string[] sss = log.Read_Settingfile("分类表");
foreach (var item in sss)
{
//拆分单行的分类,
string[] ss = item.Split(',');
List5.Add(ss);

//通过是否有值,来填会list6-9的列表里
if (ss[0] != "") { List1.Add(ss[0]); }
List6.Add(ss[0]);
if (ss[1] != "") { List2.Add(ss[1]); }
List7.Add(ss[1]);
if (ss[2] != "") { List3.Add(ss[2]); }
List8.Add(ss[2]);
if (ss[3] != "") { List4.Add(ss[3]); }
List9.Add(ss[3]);
}
//排除重复属性名
List1 = List1.Distinct().ToList();
List2 = List2.Distinct().ToList();
List3 = List3.Distinct().ToList();
List4 = List4.Distinct().ToList();

//显示树结构
TreeNodeCollection nodes1, nodes2, nodes3, nodes4;
TreeNode node1 = null, node2 = null, node3 = null, node4 = null;
if (List5 == null || List5.Count == 0) { return; }
//填入树列表的首个值
node1 = treeView1.Nodes.Add(List5[0][0]); nodes1 = node1.Nodes;
node2 = nodes1.Add(List5[0][1]); nodes2 = node2.Nodes;
node3 = nodes2.Add(List5[0][2]); nodes3 = node3.Nodes;
node4 = nodes3.Add(List5[0][3]); nodes4 = node4.Nodes;

//循环分类表txt内容里的列表list5,把逗号隔开的多级分类进行填写
for (int i = 0; i < List5.Count; i++)
{
tree_recoder.Add(node1.Text);
tree_recoder.Add(node2.Text);
tree_recoder.Add(node3.Text);
tree_recoder.Add(node4.Text);
if (!(tree_recoder.Contains(List5[i][0]))) { node1 = treeView1.Nodes.Add(List5[i][0]); node1.BackColor = System.Drawing.Color.Aqua; }
if (!(tree_recoder.Contains(List5[i][1]))) { node2 = node1.Nodes.Add(List5[i][1]); node2.BackColor = System.Drawing.Color.Olive; }
if (!(tree_recoder.Contains(List5[i][2]))) { node3 = node2.Nodes.Add(List5[i][2]); node3.BackColor = System.Drawing.Color.CadetBlue; }
if (!(tree_recoder.Contains(List5[i][3]))) { node4 = node3.Nodes.Add(List5[i][3]); node4.BackColor = System.Drawing.Color.Yellow; }
}
//空白分类在树列表移除
if (nodes1[0].Text == "") { nodes1[0].Remove(); }
if (nodes2[0].Text == "") { nodes2[0].Remove(); }
if (nodes3[0].Text == "") { nodes3[0].Remove(); }
treeView1.ExpandAll(); //全展开
treeView1.Scrollable = true; //带滚动条
}

删除

1
treeView1.Nodes.Clear();

删除指定

1
treeView1.SelectedNode.Remove();

搜索&筛选

树列表的搜索功能+筛选功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#region TreeView模糊查找节点,需要包括父级node节点
List<TreeNode> listSearchTreeNodes;
List<string> knownNodeTexts;
private void btn_Search_Click(object sender, EventArgs e)
{
// 清空筛选列表
treeView1.Nodes.Clear();
// 生成全部列表
TreeView_show();

listSearchTreeNodes = new List<TreeNode>();
if (string.IsNullOrEmpty(textBox1.Text.Trim()))
{
return;
}

// 搜索节点以及递归搜索子节点
knownNodeTexts = new List<string> { };
foreach (TreeNode node in treeView1.Nodes) { SearchLayer(node, this.textBox1.Text.Trim()); }

// 把搜索出来的节点进行展开
for (int i = 0; i < listSearchTreeNodes.Count; i++)
{
// 获得父级节点
TreeNode trNode = listSearchTreeNodes[i]; FindParentNode(trNode);
//// 选中父节点达到跳转效果
//if (i == 0 && trNode.Parent != null) { treeView1.SelectedNode = trNode.Parent; }
trNode.NodeFont = new Font("宋体", 9, FontStyle.Bold);
}

FilterTreeView(treeView1, knownNodeTexts); treeView1.ExpandAll();
toolStripStatusLabel1.Text = $"搜索到:{listSearchTreeNodes.Count} 个结果";
}
private void SearchLayer(TreeNode node, string name)//递归,搜索节点
{
if (node.Nodes.Count != 0)
{
for (int i = 0; i < node.Nodes.Count; i++) { SearchLayer(node.Nodes[i], name); }
}
else if (string.Equals(node.Text, name) || node.Text.Contains(name)) { listSearchTreeNodes.Add(node); }
}
private void FindParentNode(TreeNode node) //递归,获得父级节点
{
if (node.Parent != null) { knownNodeTexts.Add(node.Text); node.Expand(); FindParentNode(node.Parent); }
else { knownNodeTexts.Add(node.Text); }
}
private void ExpandNode(TreeNode node) //递归,展开节点
{
if (node.Parent != null) { node.Expand(); ExpandNode(node.Parent); }
}
#endregion TreeView模糊查找节点,需要包括父级node节点

#region 过滤方法,不是搜索内容的节点删除
private void FilterTreeView(TreeView treeView, List<string> knownTexts)
{
foreach (TreeNode node in treeView.Nodes.Cast<TreeNode>().ToList())
{
if (!knownTexts.Contains(node.Text)) { treeView.Nodes.Remove(node); }
else { FilterChildNodes(node, knownTexts); }
}
}
private void FilterChildNodes(TreeNode parentNode, List<string> knownTexts)
{
foreach (TreeNode node in parentNode.Nodes.Cast<TreeNode>().ToList())
{
if (!knownTexts.Contains(node.Text)) { parentNode.Nodes.Remove(node); }
else { FilterChildNodes(node, knownTexts); }
}
}
#endregion 过滤方法