如何使用C#在TreeView控件中展示4层级SQL表数据并避免根节点重复
问题原因
- 未做根节点去重:现有代码每遍历一行数据库记录就直接新增根节点,5条表数据对应生成了5个根节点,没有对相同TAB值的节点做复用。
- 层级结构错误:现有代码直接将CONTACT和SUBJECT作为根节点的直接子节点,不符合需要的
TAB -> CONTACT -> SUBJECT -> NOTES四层层级逻辑。
修正后代码
SqlCommand cm = new SqlCommand("SELECT * FROM Notebook.Notes ORDER BY Tab;", cn); try { treeView1.Nodes.Clear(); treeView1.BeginUpdate(); // 关闭加载过程中的界面刷新,避免卡顿闪烁 SqlDataReader dr = cm.ExecuteReader(); while (dr.Read()) { string tabValue = dr["TAB"].ToString(); string contactValue = dr["CONTACT"].ToString(); string subjectValue = dr["SUBJECT"].ToString(); string notesValue = dr["NOTES"].ToString(); // 查找或创建TAB根节点 TreeNode[] matchedTabNodes = treeView1.Nodes.Find(tabValue, false); TreeNode currentTabNode; if (matchedTabNodes.Length == 0) { currentTabNode = new TreeNode(tabValue) { Name = tabValue }; treeView1.Nodes.Add(currentTabNode); } else { currentTabNode = matchedTabNodes[0]; } // 查找或创建CONTACT子节点 TreeNode[] matchedContactNodes = currentTabNode.Nodes.Find(contactValue, false); TreeNode currentContactNode; if (matchedContactNodes.Length == 0) { currentContactNode = new TreeNode(contactValue) { Name = contactValue }; currentTabNode.Nodes.Add(currentContactNode); } else { currentContactNode = matchedContactNodes[0]; } // 查找或创建SUBJECT子节点 TreeNode[] matchedSubjectNodes = currentContactNode.Nodes.Find(subjectValue, false); TreeNode currentSubjectNode; if (matchedSubjectNodes.Length == 0) { currentSubjectNode = new TreeNode(subjectValue) { Name = subjectValue }; currentContactNode.Nodes.Add(currentSubjectNode); } else { currentSubjectNode = matchedSubjectNodes[0]; } // 添加最末级NOTES节点 currentSubjectNode.Nodes.Add(notesValue); } treeView1.EndUpdate(); // 所有节点加载完成后统一刷新界面 } catch (Exception ex) { MessageBox.Show(ex.Message); }
实现说明
代码中为每个节点的Name属性赋值为对应字段的实际值,用于通过Find方法快速检索已存在的节点,避免重复创建相同值的节点。如果有同TAB、同CONTACT、同SUBJECT的多条NOTES记录,会自动全部挂载到对应SUBJECT节点下。
内容的提问来源于stack exchange,提问作者user2961581
相关产品推荐
相关产品推荐

