以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  Treeview勾选父节点后子节点全部被选中方法  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=76187)


--  作者:卷积内核
--  发布时间:7/29/2009 5:18:00 PM

--  Treeview勾选父节点后子节点全部被选中方法
有父子联动功能的下拉树

/**
* 类名:ComboBoxTreeView
* 描述:下拉树控件
* 作者:
* 创建时间:2007-11-26
* 修改目的:增加双击关闭下拉框,增加父子节点关联性的控制
* */
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace ForestryUserControl
{
    public class ComboBoxTreeView : ComboBox
    {
        private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203; //单击,双击事件
        private ToolStripControlHost treeViewHost; //树控件
        private ToolStripDropDown dropDown; //下拉框
        private char separator = ','; //分割符
        private ParentNodeCheckedChange parentNodeCheckedChange =
            ParentNodeCheckedChange.AllChildrenCheckedChangeParent;//父节点根据子节点选中状态改变的方式

        //构造函数
        public ComboBoxTreeView()
        {
            //初始化一个树
            TreeView treeView = new TreeView();
            treeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(treeView_nodeMouseClick);
            treeView.MouseDoubleClick += new MouseEventHandler(treeView_MouseDoubleClick);
            treeView.LostFocus += new EventHandler(treeView_LostFocus);
            treeView.BorderStyle = BorderStyle.None;

            //初始化下拉框
            treeViewHost = new ToolStripControlHost(treeView);
            dropDown = new ToolStripDropDown();
            dropDown.Width = this.Width;
            dropDown.Items.Add(treeViewHost);
        }

        //失去焦点
        private void treeView_LostFocus(object sender, EventArgs e)
        {
            dropDown.Close();
        }

        //双击事件
        private void treeView_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            dropDown.Close();
        }

        //节点被单击时候的操作
        public void treeView_nodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode nodeBeClicked = e.Node;  //被单击的结点

            //如果被选中的节点有子孙节点,变换其子孙节点的选中状态
            if (nodeBeClicked.Nodes != null)
            {
                this.ChangeChildrenNodesCheckInfo(nodeBeClicked);
            }

            //根据子节点的被选中状态,改变父节点的被选中状态
            if (nodeBeClicked.Parent != null)
            {
                switch (this.parentNodeCheckedChange)
                {
                    case ParentNodeCheckedChange.AllChildrenCheckedChangeParent:
                        this.ChangeParentNodeCheckInfoByAll(nodeBeClicked);
                        break;
                    case ParentNodeCheckedChange.OneChildCheckedChangeParent:
                        this.ChangeParentNodeCheckInfoByOne(nodeBeClicked);
                        break;
                    default:
                        break;
                }
            }

            //将选中内容作为节点添加
            this.SelectedItem = this.GetTreeViewCheckedNodes(TreeView);

            if (this.Items != null)
            {
                this.Items.Clear();
            }

            this.Items.Add(this.GetTreeViewCheckedNodes(TreeView));
            this.SelectedIndex = 0;
        }


--  作者:卷积内核
--  发布时间:7/29/2009 5:19:00 PM

--  
//检测判断改变父节点的被选中状态(所有子节点改变才引发)
        private void ChangeParentNodeCheckInfoByAll(TreeNode tn)
        {
            bool parentChecked = true;

            //参数检测
            if ((tn == null) || (tn.Parent == null))
            {
                return;
            }

            //判断子节点中是否有未被选中的
            foreach (TreeNode brotherNode in tn.Parent.Nodes)
            {
                if (!brotherNode.Checked)
                {
                    parentChecked = false;
                    break;
                }
            }

            if (tn.Parent.Checked != parentChecked)
            {
                tn.Parent.Checked = parentChecked;
                ChangeParentNodeCheckInfoByAll(tn.Parent);
            }
        }

        //检测判断改变父节点的被选中状态(所有子节点改变就引发)
        private void ChangeParentNodeCheckInfoByOne(TreeNode tn)
        {
            bool parentChecked = false;

            //参数检测
            if ((tn == null) || (tn.Parent == null))
            {
                return;
            }

            //判断子节点中是否有被选中的
            foreach (TreeNode brotherNode in tn.Parent.Nodes)
            {
                if (brotherNode.Checked)
                {
                    parentChecked = true;
                    break;
                }
            }

            if (tn.Parent.Checked != parentChecked)
            {
                tn.Parent.Checked = parentChecked;
                ChangeParentNodeCheckInfoByOne(tn.Parent);
            }
        }

        //改变树节点的子孙结点的被选中状态
        private void ChangeChildrenNodesCheckInfo(TreeNode tn)
        {
            //参数检测
            if ((tn == null) || (tn.Nodes.Count == 0))
            {
                return;
            }

            //变换子孙结点的选中状态
            if (tn.Checked)
            {
                foreach (TreeNode subNode in tn.Nodes)
                {
                    subNode.Checked = true;
                    if (subNode.Nodes != null)
                    {
                        ChangeChildrenNodesCheckInfo(subNode);
                    }
                }
            }
            else
            {
                foreach (TreeNode subNode in tn.Nodes)
                {
                    subNode.Checked = false;
                    if (subNode.Nodes != null)
                    {
                        ChangeChildrenNodesCheckInfo(subNode);
                    }
                }
            }
        }

        //获取树中所有被选中的节点
        private string GetTreeViewCheckedNodes(TreeView tv)
        {
            if (tv == null)
            {
                return string.Empty;
            }

            StringBuilder sb = new StringBuilder();

            foreach (TreeNode tn in TreeView.Nodes)
            {
                sb.Append(this.GetTreeNodeCheckNodes(tn));
            }

            //删除最后一个多余的逗号
            if (sb.Length > 1)
            {
                sb.Remove(sb.Length - 1, 1);
            }

            return sb.ToString();
        }

        //获取树节点中所有被选中节点的字符串组合
        private string GetTreeNodeCheckNodes(TreeNode tn)
        {
            //参数检测
            if (tn == null)
            {
                return string.Empty;
            }

            StringBuilder sb = new StringBuilder();

            if (tn.Checked)
            {
                sb.Append(tn.Text + this.separator);
            }

            foreach (TreeNode childNode in tn.Nodes)
            {
                sb.Append(GetTreeNodeCheckNodes(childNode));
            }

            return sb.ToString();
        }

        //把TreeView做为属性使用
        public TreeView TreeView
        {
            get { return treeViewHost.Control as TreeView; }
        }

        //把parentNodeCheckedChange做为属性试用
        public ParentNodeCheckedChange ParentNodeCheckedState
        {
            get { return this.parentNodeCheckedChange; }
            set { this.parentNodeCheckedChange = value; }
        }

        //显示下拉树
        private void ShowDropDown()
        {
            if (dropDown != null)
            {
                treeViewHost.Size = new System.Drawing.Size(DropDownWidth - 2, DropDownHeight);
                dropDown.Show(this, 0, this.Height);
            }
        }

        //鼠标单击双击时执行ShowDropDown
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN)
            {
                ShowDropDown();
                return;
            }
            base.WndProc(ref m);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (dropDown != null)
                {
                    dropDown.Dispose();
                    dropDown = null;
                }
            }
            base.Dispose(disposing);
        }

        public enum ParentNodeCheckedChange
        {
            OneChildCheckedChangeParent,
            AllChildrenCheckedChangeParent
        }
    }
}


--  作者:卷积内核
--  发布时间:7/29/2009 5:20:00 PM

--  
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            SetCheck(e.Node);
        }
        private void SetCheck(TreeNode node)
        {
            if (node.Nodes.Count > 0)
            {
                foreach (TreeNode tn in node.Nodes)
                {
                    tn.Checked = node.Checked;
                    SetCheck(tn);
                }
            }
        }

--  作者:卷积内核
--  发布时间:7/29/2009 5:20:00 PM

--  
public Form4()
        {
            InitializeComponent();
        }
        public DataTable treeTable=null;
        public TreeNode enode;//转换使enode可以调用node
        private void Form4_FormClosed(object sender, FormClosedEventArgs e)
        {
            Form1 f1 = new Form1();
            f1.mdilength(this);
        }

        private void Form4_Load(object sender, EventArgs e)
        {
          // treeTable = new DataTable();//实例华数据表
            treeTable = GetTreeTable("select cid,cname,isnull(pid,0) pid from treeCity");//取出所有节点数据
            AddTreeNode((TreeNode)null,0);
          
        }
        DataTable GetTreeTable(string sql)
        {
            SqlConnection sqlcn= new SqlConnection();
            sqlcn.ConnectionString = "server=.;database=pubs;uid=sa;pwd=123";
            sqlcn.Open();
            SqlCommand cmd = sqlcn.CreateCommand();
            cmd.CommandText = sql;
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            sqlcn.Close();
            return dt;
        }
        /// <summary>
        /// 添加树节点的方法
        /// </summary>
        /// <param name="node">父节点名 </param>
        /// <param name="Parent_id">父节点编号 </param>
        void AddTreeNode(TreeNode node,int Parent_id)
        {
            DataView dv = new DataView(treeTable);//实例化视图
            dv.RowFilter = "pid=" + Parent_id;//设置视图表达试
            foreach (DataRowView drv in dv)//便历视图
            {
                TreeNode newNode = new TreeNode();//实例化节点
                newNode.Text = (string)drv["cname"];//节点显示的文本
                newNode.ContextMenuStrip = contextMenuStrip1;//设置节点右键菜单
                newNode.Tag = drv["cid"];//设置节点的值
                if (node == null)
                {
                    treeView1.Nodes.Add(newNode);//将节点添加到树中
                }
                else
                {
                    node.Nodes.Add(newNode);    //将节点添加到父节点中
                }
          
                AddTreeNode(newNode, (int)drv["cid"]);//递归调用本方法

            }
        }

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {

            SetCheck(e.Node);              //调用递归方法获    
            enode = e.Node;              //转换使enode可以调用node
        }
        private void SetCheck(TreeNode node)//递归方法
        {
            if (node.Nodes.Count > 0)//判断是否有子节点
            {
                foreach (TreeNode tn in node.Nodes)
                {
                    tn.Checked = node.Checked;
                    SetCheck(tn);//递归
                }
            }
        }

        private void 重命名ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            treeView1.LabelEdit=true; //开启可编辑属性
            enode.BeginEdit();  //编辑事件
              
        }

        private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
        {
            if (e.Label != null)//判断是否为空
            {          
                string sql = "update treeCity set cname=@cname where cid=@cid";
                SqlConnection sqlcn = new SqlConnection();
                sqlcn.ConnectionString = "server=.;database=pubs;uid=sa;pwd=123";
                sqlcn.Open();
                SqlCommand cmd = sqlcn.CreateCommand();
                cmd.CommandText = sql;
                cmd.Parameters.Add("@cname",SqlDbType.VarChar,50,"cname");
                cmd.Parameters["@cname"].Value = e.Label;//e.Label新值
                cmd.Parameters.Add("@cid",SqlDbType.Int,4,"cid");
                cmd.Parameters["@cid"].Value = e.Node.Tag;//原来的值
                cmd.ExecuteNonQuery();
                sqlcn.Close();
                MessageBox.Show("修改成功");
            }
        }


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
125.000ms