新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → Treeview勾选父节点后子节点全部被选中方法 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7726 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Treeview勾选父节点后子节点全部被选中方法 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 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;
            }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/7/29 17:18:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    //检测判断改变父节点的被选中状态(所有子节点改变才引发)
            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
            }
        }
    }

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/7/29 17:19:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客3
    发贴心情 
    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);
                    }
                }
            }

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/7/29 17:20:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客4
    发贴心情 
    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("修改成功");
                }
            }

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/7/29 17:20:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/18 4:08:22

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    188.477ms