C#中处理treeview相关的类函数和过程汇总(采用递归算法,支持无限级节点)

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);
        } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值