C#中处理treeview相关的类函数和过程汇总(采用递归算法,支持无限级节点)
2014-10-08 16:25
483 查看
using System.Data; using System.Data.Common; using System.IO; using System.IO.Compression; using System.Collections; using System.Collections.Generic; using System.Xml; using System.ComponentModel; using System.Globalization; using System; using System.Text; using System.Windows.Forms; using System.Net; namespace POS { /* * 處理treeview相關的過程 */ class TreeV { #region 绑定数据 /* * 数据源的结构为:PARENT_ID,ID,NAME * PARENT_ID用于父ID * ID用于子ID * NAME用于节点的描述 * 把ID的value写于Tag属性中代替value */ static public void Bind_Tv(System.Data.DataTable dt, TreeNode p_Node, string pid_val, string id, string pid, string text,TreeView tv) { DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据 TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中 //以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件 string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val); dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据 foreach (DataRowView row in dv) { tn = new TreeNode();//建立一个新节点(学名叫:一个实例) if (p_Node == null)//如果为根节点 { tn.Tag = row[id].ToString();//节点的Value值,一般为数据库的id值 tn.Text = row[text].ToString();//节点的Text,节点的文本显示 tv.Nodes.Add(tn);//将该节点加入到TreeView中 Bind_Tv(dt, tn, tn.Tag.ToString () , id, pid, text,tv);//递归(反复调用这个方法,直到把数据取完为止) } else//如果不是根节点 { tn.Tag = row[id].ToString();//节点Value值 tn.Text = row[text].ToString();//节点Text值 p_Node.Nodes.Add(tn);//该节点加入到上级节点中 Bind_Tv(dt, tn, tn.Tag.ToString () , id, pid, text,tv);//递归 } } } static public void Bind_Tv(System.Data.DataTable dt, TreeNodeCollection tnc, string pid_val, string id, string pid, string text, TreeView tv) { DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据 TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中 //以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件 string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val); dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据 foreach (DataRowView drv in dv) { tn = new TreeNode();//建立一个新节点(学名叫:一个实例) tn.Tag = drv[id].ToString();//节点的Value值,一般为数据库的id值 tn.Text = drv[text].ToString();//节点的Text,节点的文本显示 tnc.Add(tn);//将该节点加入到TreeNodeCollection(节点集合)中 Bind_Tv(dt, tn.Nodes , tn.Tag.ToString () , id, pid, text,tv);//递归(反复调用这个方法,直到把数据取完为止) } } #endregion public static void CheckControl(TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { if (e.Node != null && !Convert.IsDBNull(e.Node)) { CheckParentNode(e.Node); if (e.Node.Nodes.Count > 0) { CheckAllChildNodes(e.Node, e.Node.Checked); } } } } #region 私有方法 //改变所有子节点的状态 private static void CheckAllChildNodes(TreeNode pn, bool IsChecked) { foreach (TreeNode tn in pn.Nodes) { tn.Checked = IsChecked; if (tn.Nodes.Count > 0) { CheckAllChildNodes(tn, IsChecked); } } } //改变父节点的选中状态,此处为所有子节点不选中时才取消父节点选中,可以根据需要修改 private static void CheckParentNode(TreeNode curNode) { bool bChecked = false; if (curNode.Parent != null) { foreach (TreeNode node in curNode.Parent.Nodes) { if (node.Checked) { bChecked = true; break; } } if (bChecked) { curNode.Parent.Checked = true; CheckParentNode(curNode.Parent); } else { curNode.Parent.Checked = false; CheckParentNode(curNode.Parent); } } } #endregion } }
在form中写如下代码:
private void frmFX_BMMUT_Load(object sender, EventArgs e) { Bind_Tree(); } private void Bind_Tree() { waiting f = new waiting(); try { f.Show(); TreeV.Bind_Tv(dsJB.Tables["TV"], tvBM.Nodes, null, "ID", "PARENT_ID", "NAME", tvBM); dsSYS_MUT_BM = Query_SYS_MUT_BM(); if (dsSYS_MUT_BM != null) { bsSYS_MUT_BM.DataSource = dsSYS_MUT_BM.Tables[0]; dgvBM.DataSource = bsSYS_MUT_BM; } if (tvBM.Nodes.Count > 0) { if (!tvBM.Nodes[0].IsExpanded)//第一个节点展开 { tvBM.Nodes[0].Expand(); } } } finally { f.Close(); } } private void tvBM_AfterCheck(object sender, TreeViewEventArgs e) { TreeV.CheckControl(e); }
相关文章推荐
- C#.Net中TreeView控件右键选择节点问题处理
- C#TreeView连接SQL数据库(可实现无限节点)
- 带checkbox的C# TreeView处理父子节点选择
- C# EXCEL表格处理相关函数
- 在VS2005中采用c#书写存储过程和函数等以及使用
- 汇总c#.net常用函数和方法集
- 汇总c#常用函数和方法集
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- 使用TreeView实现无限级扩展节点(原创)
- SQL过程自动C#封装,支持从表到基本存储过程生成,
- 汇总c#.net常用函数和方法集
- T-SQL: 三个通用的与日期相关的,辅助按周(星期日是周的最后一天)汇总的自定义函数
- 汇总c#.net常用函数和方法集
- 如何C#中实现在TreeView查找某一节点
- 汇总c#.net常用函数和方法集
- 汇总c#常用函数和方法集
- 汇总c#.net常用函数和方法集
- 为什么C#不支持函数默认参数呢
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- 模拟字符串处理函数 stuff 的存储过程,对 ntext 字段进行stuff .