我需要实现这样一个功能:    一个treeview中有两级节点,每个节点前都有复选框,当我选中根节点的时候,当前根节点下的所有子节点同时也被选中并且禁用所有子节点,当选择其中一个子节点时,他的根节点被选中。在选择节点时做判断,根节点最多能选择三项,子节点最多能选择两项!

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                TreeNode tn = new TreeNode();
                tn.Name = "root";
                tn.Text = "一级节点";            TreeNode tn1 = new TreeNode();
                TreeNode tn2 = new TreeNode();
                TreeNode tn3 = new TreeNode();
                tn1.Text = "二级节点";
                tn2.Text = "二级节点";
                tn3.Text = "二级节点";            tn.Nodes.Add(tn1);
                tn.Nodes.Add(tn2);
                tn.Nodes.Add(tn3);            treeView1.Nodes.Add(tn);
                treeView1.ExpandAll();
            }
            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                TreeNode tn = e.Node;            if (tn.Checked)
                {
                    if (tn.Name == "root")
                    {
                        tn.Checked = true;
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            tn.Nodes[i].Checked = true;
                        }
                    }
                    else
                    {
                        tn.Checked = true;
                        tn.Parent.Checked = true;
                    }
                }
                else
                {
                    if (tn.Name == "root")
                    {
                        tn.Checked = false;
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            tn.Nodes[i].Checked = false;
                        }
                    }
                    else
                    {
                        tn.Checked = false;
                        bool check = false;
                        for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                        {
                            if (tn.Parent.Nodes[i].Checked)
                            {
                                check=true;
                                break;
                            }
                        }                    if (!check)
                        {
                            tn.Parent.Checked = false;
                        }
                    }
                
                }
            }
        }
    }
      

  2.   

    用第三方控件!Devexpress!!里面的一个TreeList你看看,实现你这个应该不难
      

  3.   

    TreeView属性 checkboxes 设置 true
      

  4.   


    //这里是JQuery的语法,给TreeView控件的CheckBox加载事件
    //当选中父节点时,子节点全选中;当不选择父节点,但选择一个子节点时,父节点默认也选中
    <script>
    $(document).ready(function()
    {
    var funcStr="$(\":checkbox\").click(function(){CheckedChildNode(this);});"; 
    eval(funcStr); 
    });
    function valid()
    {
      var ids="";
      for(var i=0;i<$("input:checked").size();i++)
      {
      ids+=$("input:checked").eq(i).val()+",";
      }
      if(ids=="")
      {
      return confirm("没选中任何信息,是否继续?");
      }
      return true;
    }function CheckedChildNode(obj)
    {
      var divs = obj.parentElement.parentElement.parentElement.parentElement.nextSibling;
      if(divs!=null && divs.tagName=="DIV")
      {
      divs=divs.getElementsByTagName("input");
      for(var i=0;i<divs.length;i++)
      {
      if(divs[i].type=="checkbox")
      {
      divs[i].checked=obj.checked;
      }
      }
      }
      if(obj.checked)
      {
      divs = obj.parentElement.parentElement.parentElement.parentElement.parentElement.previousSibling;
      var ips=divs.getElementsByTagName("input");
      for(var i=0;i<ips.length;i++)
      {
      if(ips[i].type=="checkbox")
      {
      ips[i].checked=obj.checked;
      }
      }
      while(divs.parentElement!=null)
      {
      divs=divs.parentElement;
      if(divs!=null && divs.tagName=="DIV")
      {
      divs=divs.previousSibling;
      var ips=divs.getElementsByTagName("input");
      for(var i=0;i<ips.length;i++)
      {
      if(ips[i].type=="checkbox")
      {
      ips[i].checked=obj.checked;
      }
      }
      }
      }
      }
    }
    </script>
      

  5.   

    Devexpress控件的效率不是很好。
      

  6.   

    好像没有禁用这个属性   可以控制点击无效using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                TreeNode tn = new TreeNode();
                tn.Name = "root";
                tn.Text = "一级节点";
                tn.ToolTipText = "adfsfsdaf";
               
                TreeNode tn1 = new TreeNode();
                TreeNode tn2 = new TreeNode();
                TreeNode tn3 = new TreeNode();
                tn1.Text = "二级节点";
                tn2.Text = "二级节点";
                tn3.Text = "二级节点";
                
                tn.Nodes.Add(tn1);
                tn.Nodes.Add(tn2);
                tn.Nodes.Add(tn3);            treeView1.Nodes.Add(tn);
                treeView1.ExpandAll();
            }
            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                TreeNode tn = e.Node;            if (tn.ForeColor == Color.Gray)
                {
                    return;
                
                }            if (tn.Checked)
                {
                    if (tn.Name == "root")
                    {
                        tn.Checked = true;
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            tn.Nodes[i].Checked = true;
                            tn.Nodes[i].ForeColor = Color.Gray;
                            tn.Nodes[i].BackColor = Color.White;
                        }
                    }
                    else
                    {
                        tn.Checked = true;
                        tn.Parent.Checked = true;
                    }
                }
                else
                {
                    if (tn.Name == "root")
                    {
                        tn.Checked = false;
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            tn.Nodes[i].Checked = false;
                            tn.Nodes[i].ForeColor = treeView1.ForeColor;
                            tn.Nodes[i].BackColor = treeView1.BackColor;
                        }
                    }
                    else
                    {
                        tn.Checked = false;
                        bool check = false;
                        for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                        {
                            if (tn.Parent.Nodes[i].Checked)
                            {
                                check=true;
                                break;
                            }
                        }                    if (!check)
                        {
                            tn.Parent.Checked = false;
                        }
                    }
                
                }
            }        private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
            {
                TreeNode tn = e.Node;
                if (tn.Parent==null)
                {
                    return;
                }
                if (tn.Parent.Checked&&tn.ForeColor == Color.Gray)
                {
                    e.Cancel = true;
                    return;            }
            }
        }
    }
      

  7.   

    在treeView1_BeforeCheck事件中 判断  不想让他点  e.Cancel = true; 就行了
     
      

  8.   

    还是不太明白,我现在是这样写的        private void tvTypeListSWYY_BeforeCheck(object sender, TreeViewCancelEventArgs e)
            {        }        private void tvTypeListSWYY_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                TreeNode tn = e.Node;            if (tn.Checked)
                {
                    if (tn.Parent == null)
                    {
                        tn.Checked = true;
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            tn.Nodes[i].Checked = true;
                            //需要在这里,把子节点禁用!但根节点不禁用,如果根节点取消选择的时候,子节点再启用!
                        }
                    }
                    else
                    {
                        tn.Checked = true;
                        tn.Parent.Checked = true;
                                                                int j = 0;
                        for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                        {
                            if (tn.Parent.Nodes[i].Checked)
                            {
                                j++;
                                if (j > 2)
                                {
                                    MessageBox.Show("小类最多选2项", "提示信息", MessageBoxButtons.OK);
                                    tn.Parent.Nodes[i].Checked = false;
                                    return;
                                }
                            }                    }
                    }
                }
                else
                {
                    if (tn.Parent == null)
                    {
                        tn.Checked = false;
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            tn.Nodes[i].Checked = false;
                        }
                    }
                    else
                    {
                        tn.Checked = false;
                        bool check = false;
                        for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                        {
                            if (tn.Parent.Nodes[i].Checked)
                            {
                                check = true;
                                break;
                            }
                        }                    if (!check)
                        {
                            tn.Parent.Checked = false;
                        }
                    }
                }            int k = 0;
                for (int i = 0; i < tvTypeListSWYY.Nodes.Count; i++)
                {
                    if (tvTypeListSWYY.Nodes[i].Checked)
                    {
                        k++;
                        if (k > 3)
                        {
                            MessageBox.Show("大类最多选3项", "提示信息", MessageBoxButtons.OK);
                            tvTypeListSWYY.Nodes[i].Checked = false;
                            for (int j = 0; j < tvTypeListSWYY.Nodes[i].Nodes.Count; j++)
                            {
                                tvTypeListSWYY.Nodes[i].Nodes[j].Checked = false;
                            }
                            return;
                        }
                    }
                }
            }
      

  9.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        bool ischeck = false;
            bool ischeck2 = false;        private void Form1_Load(object sender, EventArgs e)
            {
                TreeNode tn = new TreeNode();
                tn.Name = "root";
                tn.Text = "一级节点1";            TreeNode tnn = new TreeNode();
                tnn.Text = "一级节点2";            TreeNode tnnn = new TreeNode();
                tnnn.Text = "一级节点3";            TreeNode tnnnn = new TreeNode();
                tnnnn.Text = "一级节点4";            TreeNode tn1 = new TreeNode();
                TreeNode tn2 = new TreeNode();
                TreeNode tn3 = new TreeNode();
                TreeNode tn4 = new TreeNode();
                TreeNode tn5 = new TreeNode();            tn1.Text = "二级节点";
                tn2.Text = "二级节点";
                tn3.Text = "二级节点";
                tn4.Text = "二级节点";
                tn5.Text = "二级节点";
                tn.Nodes.Add(tn1);
                tn.Nodes.Add(tn2);
                tn.Nodes.Add(tn3);
                tn.Nodes.Add(tn4);
                tn.Nodes.Add(tn5);            treeView1.Nodes.Add(tn);
                treeView1.Nodes.Add(tnn);
                treeView1.Nodes.Add(tnnn);
                treeView1.Nodes.Add(tnnnn);
                treeView1.ExpandAll();
            }
            private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
            {
                if (ischeck2)
                {
                    return;
                }
                TreeNode tn = e.Node;
                if (tn.ForeColor == Color.Gray)
                {
                    e.Cancel = true;
                    return;
                }
            }        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                if (ischeck)
                {
                    return;
                }            TreeNode tn = e.Node;            if (tn.Level == 0)
                {                if (tn.Checked)
                    {
                        int j = 0;
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            j++;
                            if (j <= 2)
                            {
                                tn.Nodes[i].Checked = true;
                            }
                            tn.Nodes[i].ForeColor = Color.Gray;
                            tn.Nodes[i].BackColor = Color.White;
                        }                }
                    else
                    {
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            ischeck2 = true;
                            tn.Nodes[i].Checked = false;
                            ischeck2 = false;
                            tn.Nodes[i].ForeColor = treeView1.ForeColor;
                            tn.Nodes[i].BackColor = treeView1.BackColor;
                        }
                    }                int k = 0;
                    for (int i = 0; i < treeView1.Nodes.Count; i++)
                    {
                        if (treeView1.Nodes[i].Checked)
                        {
                            k++;
                        }
                    }
                    if (k >= 3)
                    {
                        for (int i = 0; i < treeView1.Nodes.Count; i++)
                        {
                            if (!treeView1.Nodes[i].Checked)
                            {
                                treeView1.Nodes[i].ForeColor = Color.Gray;
                                treeView1.Nodes[i].BackColor = Color.White;
                            }
                        }                    return;
                    }
                    else
                    {
                        for (int i = 0; i < treeView1.Nodes.Count; i++)
                        {
                            if (!treeView1.Nodes[i].Checked)
                            {
                                treeView1.Nodes[i].ForeColor = treeView1.ForeColor;
                                treeView1.Nodes[i].BackColor = treeView1.BackColor;
                            }
                        }
                    }
                }            else
                {
                    if (tn.Parent != null)
                    {
                        ischeck = true;
                        tn.Parent.Checked = true;
                        ischeck = false;
                        int k = 0;
                        for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                        {
                            if (tn.Parent.Nodes[i].Checked)
                            {
                                k++;
                            }
                        }
                        if (k == 0)
                        {
                            ischeck = true;
                            tn.Parent.Checked = false;
                            ischeck = false;
                        }
                        if (k >= 2)
                        {
                            for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                            {
                                if (!tn.Parent.Nodes[i].Checked)
                                {
                                    tn.Parent.Nodes[i].ForeColor = Color.Gray;
                                    tn.Parent.Nodes[i].BackColor = Color.White;
                                }
                            }                        return;
                        }
                        else
                        {
                            for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                            {
                                if (!tn.Parent.Nodes[i].Checked)
                                {
                                    tn.Parent.Nodes[i].ForeColor = treeView1.ForeColor;
                                    tn.Parent.Nodes[i].BackColor = treeView1.BackColor;
                                }
                            }
                        }
                    }            }
            }
        }
    }
      

  10.   

    不好意思 误导你了 不应该写在NodeMouseClick事件中
      

  11.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            bool ischeck = false;
            bool ischeck2 = false;        private void Form1_Load(object sender, EventArgs e)
            {
                TreeNode tn = new TreeNode();
                tn.Name = "root";
                tn.Text = "一级节点1";            TreeNode tnn = new TreeNode();
                tnn.Text = "一级节点2";            TreeNode tnnn = new TreeNode();
                tnnn.Text = "一级节点3";            TreeNode tnnnn = new TreeNode();
                tnnnn.Text = "一级节点4";            TreeNode tn1 = new TreeNode();
                TreeNode tn2 = new TreeNode();
                TreeNode tn3 = new TreeNode();
                TreeNode tn4 = new TreeNode();
                TreeNode tn5 = new TreeNode();            tn1.Text = "二级节点";
                tn2.Text = "二级节点";
                tn3.Text = "二级节点";
                tn4.Text = "二级节点";
                tn5.Text = "二级节点";
                tn.Nodes.Add(tn1);
                tn.Nodes.Add(tn2);
                tn.Nodes.Add(tn3);
                tn.Nodes.Add(tn4);
                tn.Nodes.Add(tn5);            treeView1.Nodes.Add(tn);
                treeView1.Nodes.Add(tnn);
                treeView1.Nodes.Add(tnnn);
                treeView1.Nodes.Add(tnnnn);
                treeView1.ExpandAll();
            }        private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
            {
                if (ischeck2)
                {
                    return;
                }
                TreeNode tn = e.Node;
                if (tn.ForeColor == Color.Gray)
                {
                    e.Cancel = true;
                    return;
                }        }        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                if (ischeck)
                {
                    return;
                }            TreeNode tn = e.Node;            if (tn.Level == 0)
                {                if (tn.Checked)
                    {
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            ischeck2 = true;
                            tn.Nodes[i].Checked = true;
                            ischeck2 = false;
                            tn.Nodes[i].ForeColor = Color.Gray;
                            tn.Nodes[i].BackColor = Color.White;
                        }                }
                    else
                    {
                        for (int i = 0; i < tn.Nodes.Count; i++)
                        {
                            ischeck2 = true;
                            tn.Nodes[i].Checked = false;
                            ischeck2 = false;
                            tn.Nodes[i].ForeColor = treeView1.ForeColor;
                            tn.Nodes[i].BackColor = treeView1.BackColor;
                        }
                    }                int k = 0;
                    for (int i = 0; i < treeView1.Nodes.Count; i++)
                    {
                        if (treeView1.Nodes[i].Checked)
                        {
                            k++;
                        }
                    }
                    if (k >= 3)
                    {
                        for (int i = 0; i < treeView1.Nodes.Count; i++)
                        {
                            if (!treeView1.Nodes[i].Checked)
                            {
                                treeView1.Nodes[i].ForeColor = Color.Gray;
                                treeView1.Nodes[i].BackColor = Color.White;
                            }
                        }                    return;
                    }
                    else
                    {
                        for (int i = 0; i < treeView1.Nodes.Count; i++)
                        {
                            if (!treeView1.Nodes[i].Checked)
                            {
                                treeView1.Nodes[i].ForeColor = treeView1.ForeColor;
                                treeView1.Nodes[i].BackColor = treeView1.BackColor;
                            }
                        }
                    }
                }            else
                {                if (ischeck2)
                    {
                        return;
                    }
                    if (tn.Parent != null)
                    {
                        ischeck = true;
                        tn.Parent.Checked = true;
                        ischeck = false;
                        int k = 0;
                        for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                        {
                            if (tn.Parent.Nodes[i].Checked)
                            {
                                k++;
                            }
                        }
                        if (k == 0)
                        {
                            ischeck = true;
                            tn.Parent.Checked = false;
                            ischeck = false;
                        }
                        if (k >= 2)
                        {
                            for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                            {
                                if (!tn.Parent.Nodes[i].Checked)
                                {
                                    tn.Parent.Nodes[i].ForeColor = Color.Gray;
                                    tn.Parent.Nodes[i].BackColor = Color.White;
                                }
                            }                        return;
                        }
                        else
                        {
                            for (int i = 0; i < tn.Parent.Nodes.Count; i++)
                            {
                                if (!tn.Parent.Nodes[i].Checked)
                                {
                                    tn.Parent.Nodes[i].ForeColor = treeView1.ForeColor;
                                    tn.Parent.Nodes[i].BackColor = treeView1.BackColor;
                                }
                            }
                        }
                    }
                }
            }
        }
    }