C# WinForms TreeView 递归绑定数据实现方法

Cora
Cora
发布时间:2026-10-13 | 2人浏览过
原创

在C# Windows Forms开发中,经常需要将具有层级关系的数据(如文件夹结构、部门组织)展示在树形控件中。本文详细介绍如何通过递归算法,将DataTable数据源高效、准确地绑定至TreeView控件,实现动态节点的创建与父子关系的建立。

核心思路与准备条件

实现Treeview绑定的关键在于正确处理“父子对应”关系。通常数据表中包含表示层级的字段(如 ID 和 PARENT_NODE)。我们需要遍历数据表,首先找到根节点,然后递归查找其子节点,直到所有节点都被填充完毕。

本示例基于以下前提:

  • 使用 C# WinForms 环境。
  • 数据源为 System.Data.DataTable。
  • 数据表包含关键字段:NODE_NAME(节点名称)、id(唯一标识)、PARENT_NODE(父节点标识,根节点通常为'0')。

真实操作顺序

第1步:加载数据并触发绑定

目的:在窗体初始化时获取数据并启动绑定逻辑。

入口:窗体的 Page_Load 事件(Web Form场景)或 Form_Load 事件(WinForms场景)。

动作:

  1. 判断是否为回发(若是Web环境),首次加载时才执行绑定。
  2. 调用数据访问层(BLL)获取 DataTable。
  3. 调用自定义的绑定方法。
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        bindTree();
    }
}

private void bindTree()
{
    // 假设 bll.PIC_Bind() 返回包含层级数据的 DataTable
    DAL.ALIYUN_PIC.BLL.Folder_oper_BLL bll = new DAL.ALIYUN_PIC.BLL.Folder_oper_BLL();
    DataTable dt = bll.PIC_Bind();
    
    // 清空现有节点,防止重复绑定
    this.PIC_TREE.Nodes.Clear();
    
    // 开始递归填充,此时无父节点,传入 null
    FillNode(dt, null);
}

第2步:编写递归填充方法 FillNode

目的:利用 DataView.RowFilter 筛选当前父节点下的直接子节点,并递归调用自身以处理更深层级。

参数说明:

  • dt: 完整的数据表。
  • node: 当前正在处理的父节点实例。若为 null,表示正在寻找根节点。
  • 动作:

  1. 构建过滤器:
    • 如果 node == null,设置过滤条件为 PARENT_NODE='0'(获取根节点)。
    • 否则,设置过滤条件为 PARENT_NODE='node.Value'(获取指定父节点下的子节点)。
  2. 遍历结果集:使用 DataView 遍历筛选后的行。
  3. 创建节点:实例化 TreeNode,名称取自 NODE_NAME,值(Value)取自 id。
  4. 添加节点:
    • 若 node == null(根节点),将其添加到 PIC_TREE.Nodes。
    • 若 node != null(子节点),将其添加到 node.ChildNodes。
  5. 递归调用:立即对刚创建的 TreeNode 再次调用 FillNode,从而深入下一层级。
private void FillNode(DataTable dt, TreeNode node)
{
    DataView dv = new DataView(dt);
    
    // 根据是否有父节点,确定筛选条件
    if (node == null)
    {
        // 筛选根节点:父节点标识为 '0'
        dv.RowFilter = "PARENT_NODE='0'";
    }
    else
    {
        // 筛选子节点:父节点标识等于当前节点的值
        dv.RowFilter = "PARENT_NODE='" + node.Value + "'";
    }
    
    // 遍历筛选出的所有直接子节点
    foreach (DataRowView drv in dv)
    {
        // 创建新节点,Text为显示名,Value为唯一ID
        TreeNode no = new TreeNode(drv["NODE_NAME"].ToString(), drv["id"].ToString());
        
        // 【关键】递归填充该新节点的子节点
        FillNode(dt, no); 
        
        // 将新节点挂接到正确的父级容器中
        if (node == null)
        {
            this.PIC_TREE.Nodes.Add(no);
        }
        else
        {
            node.ChildNodes.Add(no);
        }
    }
}

完成判断

运行程序后,检查 PIC_TREE 控件是否展开显示了所有层级的数据。点击不同级别的节点应能正常选中,且无报错。若数据中存在死循环引用或ID不匹配,可能导致部分节点不显示或异常,请检查 PARENT_NODE 字段与 id 字段的对应关系。

简要总结

上述关于 C# 实现 Treeview 递归数据绑定的详细内容,更多关于 C# WinForms 控件开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表