You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:09:02