C# WinForms TreeView 递归绑定数据实现方法
在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场景)。
动作:
- 判断是否为回发(若是Web环境),首次加载时才执行绑定。
- 调用数据访问层(BLL)获取
DataTable。 - 调用自定义的绑定方法。
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,表示正在寻找根节点。
动作:
- 构建过滤器:
- 如果
node == null,设置过滤条件为PARENT_NODE='0'(获取根节点)。 - 否则,设置过滤条件为
PARENT_NODE='(获取指定父节点下的子节点)。node.Value'
- 如果
- 遍历结果集:使用
DataView遍历筛选后的行。 - 创建节点:实例化
TreeNode,名称取自NODE_NAME,值(Value)取自id。 - 添加节点:
- 若
node == null(根节点),将其添加到PIC_TREE.Nodes。 - 若
node != null(子节点),将其添加到node.ChildNodes。
- 若
- 递归调用:立即对刚创建的
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 控件开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









