关于作者

treeview(winform)里实现父选子全选,某一子选所有父选

上一篇 / 下一篇  2008-01-10 11:20:05

长话短说,上代码:

绑定treeview
,r%Meo/d#Q(K0private void GetMenuStripItemName(ToolStripItemCollection items, TreeNodeCollection treeNodeCollection)无忧脚本y]#H%bx/]w
        {无忧脚本z/\CJ,\$A7]
            foreach (ToolStripItem item in items)无忧脚本5OLQ6S/f:} XP
            {
7}g4Q~ s3}.q@6R0                if (item is System.Windows.Forms.ToolStripMenuItem)无忧脚本"[w4lk mR~
                {
0LW9E0pst0                TreeNode tempTreeNode = new TreeNode(item.Text);无忧脚本IQ [6MoN*L|9W"{+uo
                tempTreeNode.Checked = IsHaveRight(item.Text);
1[s \m)GI#w0                treeNodeCollection.Add(tempTreeNode);

              
%@X3GE]qcR(Xf,d0                    this.GetMenuStripItemName(((ToolStripMenuItem)item).DropDownItems, tempTreeNode.Nodes);无忧脚本q(`6W7gV+A&K~'L[
                }无忧脚本,_ ] AFu
            }无忧脚本P'qW,x Y`4K D
        }
:` _VS4~#OV0        //得到用户权限
+?-FP$q dy+TT*x&[8l/x0        private bool IsHaveRight(string MenuText)无忧脚本i/~MRK$o
        {
\_F1R&z+W,J0            //foreach (User.UserRightRow row in user.UserRight)无忧脚本F l:^-Xq W$uSJ
            //{无忧脚本/Czwz2U7EDE
            //    if (row.UserRightMenu == MenuText)
8A.Vww&Z0            //    {无忧脚本:a~/O"z n `
            //        if (row.UserHaveRight == true)
!s D"xC+Amw$E0            //        {
Br#l8pcg$pK;[0            //            return true;无忧脚本/Vuu%|#c+T
            //        }
5fpN^ Y,yUkek0            //        else
,L d NP5R.m"T0            //        {
3_ `+]5xH0            //            return false;
c.kJ ` wMn0            //        }
@ ]3l_2NI0            //    }
@ B Mm m/}O0            //}无忧脚本 Qj9Yt_7QcQ\
            return false;
.\P;H ^I QK0        }

得到主form的菜单,注意,要设置主form的MainMenuStrip无忧脚本RR(c,_4c pbA%z(O
 private void PopedomForm_Load(object sender, EventArgs e)
M XYK!d)G!b^/S0        {无忧脚本YcCegk
            MenuStrip menu = this.ParentForm.MainMenuStrip;无忧脚本.D!s-^h9J3AU
            GetMenuStripItemName(menu.Items, treeView1.Nodes);无忧脚本EMo-H&oP!~
        }

在选中事件中

无忧脚本yr\6EM hVH
        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)无忧脚本VW/B4jL2yh
        {无忧脚本eyR6^ F;_,p?"a
            if (e.Action != TreeViewAction.Unknown)无忧脚本A_M3\"P,~Sj#M
            {无忧脚本/^'C%A8UKe`:lu
                CheckAllChildNodes(e.Node, e.Node.Checked);

                //选中父节点  
4m.k6bI7S8J0                bool bol = true;无忧脚本 J+J[m&P
                if (e.Node.Parent != null)无忧脚本7r [| S0?(|
                {无忧脚本O$l"~:UIP%as
                    //for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)无忧脚本 A'C:@S J zM
                    //{
(l0QfB;?0?{|4FXW0                    //    if (!e.Node.Parent.Nodes[i].Checked)无忧脚本.AN{&A8y!G.O{
                    //        bol = false;
MMSb2\n0                    //}

无忧脚本$fguZ$KQr9x:H
                    ///修改当某一子节点选中时,所有父节点选中。当子节点全取消选中时,所有父节点选中无忧脚本/D+?4I$BD"t v(a
                    bol = e.Node.Checked;无忧脚本z3X oC[Pal|
                    if (bol == true)
$\n5R YlmX0                    { }无忧脚本P:^K;B5A8q"Qhj3l
                    else
DBv2nP,Me4n0                    {无忧脚本J9m?2_ ncw
                        for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)无忧脚本V.@(Cr7b\E
                        {无忧脚本z lq:J6jVc3E/kT
                            if (e.Node.Parent.Nodes[i].Checked)无忧脚本 [j8u2@H%b2FP9{
                            {
VV _]Ed+GK I0                                bol = true;无忧脚本q%['m-~k-F QhGC
                                break;无忧脚本o:V,Wk&VgD4e
                            }无忧脚本6f6xu5w `N e&db(N f
                        }无忧脚本 z.P(B%[O
                    }


CR$h!B"U c0                    TreeNode tn = e.Node;无忧脚本R0~Cn-zD9P
                    while (tn.Parent != null)无忧脚本eagy/I2j
                    {无忧脚本4q_*I,EGxKm"g N(w }
                        tn = tn.Parent;
"wu3g'W)~0                        tn.Checked = bol;
'r(E LD7L[0                    }
rs+XQ |0                    tn.Checked = bol;
(u|,YV;S)e1b t0                }
o7m$MzkNf ev F$k0            }   无忧脚本0IT?4x,h_^g
        }
&H6{+\z.A%Gd7H0//选中子节点   无忧脚本#Grp q[)UR1P\{
        public void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
l:lP0P6eb Q0        {
%t5D+oc^$F C@E1c0            foreach (TreeNode node in treeNode.Nodes)
/D T-C d's)t J0            {
2tZ%Rfl8\0                node.Checked = nodeChecked;无忧脚本p!uuEFR0AW7e\
                if (node.Nodes.Count > 0)无忧脚本9rwDxv:q
                {无忧脚本2\^ am,ZP
                    this.CheckAllChildNodes(node, nodeChecked);无忧脚本Q|$}"K1Z3z8]
                }
\!}'W ^_,T:v0            }无忧脚本1L3ma @2s3Nf4f\
        }

 

//法二

using System;无忧脚本Ks,KN"p
using System.Collections.Generic;
.l)K8LM7a0using System.ComponentModel;
6]&uZ:^|;i0using System.Data;
Gs]-qxHw`0using System.Drawing;
0n&_-DPj0using System.Text;
@d)i u&I1~*F0using System.Windows.Forms;

namespace WinFormTest
tYcez(\D0{
hR1Sj \*G,} m[Kr0    public partial class Manage : Form
/MsIa3S4X(p0    {无忧脚本 Q)|^5J Xbu
        public Manage()
q2]EtK&R0        {
X/r8L"}X5|0V$o `0            InitializeComponent();
.pX+DR9H;zt(Y0        }

        private void Manage_Load(object sender, EventArgs e)无忧脚本2qbm8SW+L(h"Q
        {无忧脚本`^Q,g g7_6E
            DataSet ds = new DataSet();

            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["connString1"].ToString());无忧脚本$jc;V8b*|%NO L'b
            System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("Select * from TreeTemp", conn);无忧脚本} U6L#YNW;y|
            da.Fill(ds);
x#rPW{6c0            buildTree(this.treeView1, ds);无忧脚本`6X6Auxna5D
        }

        private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
X)`Ls#QR l#jO0        {无忧脚本0l}3X/R_+m
            if (e.Node.Nodes.Count == 0)无忧脚本;X?J Z/vx4q,^h
            {无忧脚本)e+g)u j:kx
                MessageBox.Show(e.Node.Name);
_b&m6j8m Z;{S1x&@sL0            }无忧脚本&x6S(`1mtsf
        }


-?J)lN+]'T9\0        public bool buildTree(TreeView TreeViewName, DataSet ds)
6n2@&Tu0DE%U0        {
z(g ~9H![|Ag0            treeView1.Nodes.Clear();
1N|/jE,xo,nD0            无忧脚本~4q/b.Ek/EX!zD
            //如果为最高级,则修改以适应ds的relation中的关系
8sY;mc3["@ x0            foreach (DataRow dbRow in ds.Tables[0].Rows)
ZZTJu I^2_\7B0            {无忧脚本z F\L P a6C5O
                if (dbRow["ParentMenu"].ToString() == "0")
9~2l(Z-}k0                {
8t;ca/]B0                    dbRow["ParentMenu"] = DBNull.Value;无忧脚本 J9s&@3M3G)v'T
                }
UebX9v-^5n0            }
8i3QD k T-~0            ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["ChildMenuID"], ds.Tables[0].Columns["ParentMenu"]);

            //循环绑定父node无忧脚本*c[ S1lPr;a(N
            foreach (DataRow dbRow in ds.Tables[0].Rows)无忧脚本)KO%~i:r
            {
nh+x H$TVa c+F5pW;h g0                if (dbRow.IsNull("ParentMenu"))
"oS[v J;B0                {无忧脚本D1miK4aD$||3Z!~2G*y
                    TreeNode newNode = CreateNode(dbRow["ChildMenu"].ToString(), dbRow["NavigateUrl"].ToString());
@(CJt{4c b0                   
%]*m JW _ xs-U@D0                    TreeViewName.Nodes.Add(newNode);
8dE;E^/er'DNe0                    PopulateSubTree(dbRow, newNode);//绑定此父节点的所有子节点无忧脚本#ALf*qX3GV
                }无忧脚本;HK;Fi#Ka;aSc4x
            }
RG+s6tm$b0            return true;无忧脚本)wk}%rm)N#yy^
        }
eR N6J c;tgO{UG0        private void PopulateSubTree(DataRow dbRow, TreeNode node)无忧脚本ltqS9~F]eFE
        {
{;_)ar0To*T$R#?0            foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
7q'}+Y3M2{n)k-ux0            {无忧脚本j+VB:V+p/kt
                TreeNode childNode = CreateNode(childRow["ChildMenu"].ToString(), childRow["NavigateUrl"].ToString());
8i oXh/anGrjz0                node.Nodes.Add(childNode);
-v(|2Qq;CB0                无忧脚本c1\&RO*[A
                PopulateSubTree(childRow, childNode);
hfE_:V&Q0            }
4xPh&_ \ J]cCoj0        }

        private TreeNode CreateNode(string text, string NavigateUrl)无忧脚本E7y,U"` L}
        {无忧脚本e)E$\If'L
            TreeNode node = new TreeNode();无忧脚本;NeiTH4]4{
            /*无忧脚本HFWwFRe.Wo+\
             * 其他node属性自己添加,现在只添加两个无忧脚本_M2gP O0L.w n
            node.ID;无忧脚本lh0R'f_B3k%v*a+E
            node.ImageUrl;无忧脚本5L)T,kJ8az/h3d
            node.Target;无忧脚本V{9yT F?yZt}/W
            node.Expanded;
c'bc ^LI7g7q0            node.CheckBox
a!}Q@Ftd0             * */无忧脚本Z#Cu'Ah/q}/Bw
            node.Text = text;
o&F2F%e1Z1f/Y0S Bo V:n_v0            node.Name = NavigateUrl;无忧脚本E/^P\p
            return node;
L9D Y7B*X0        }

        private void button1_Click(object sender, EventArgs e)无忧脚本F1Y4QnT5Q3ZKyb
        {无忧脚本+A&Zr]i,f
            MessageBox.Show(this.treeView1.Nodes.Count.ToString());
^yMMLN Y0            //Form1 f1 = new Form1();
y;I0bH+p6R0            //f1.ShowDialog();
,P9dn)~Zy6Zc3X#`0        }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
K1Dy*Q3C8h v|S0        {无忧脚本o:GbfdV'j/Ci|X
            if (e.Action != TreeViewAction.Unknown)
~h'nE6D0            {
~"W.XQ,MA"Za o|0                CheckAllChildNodes(e.Node, e.Node.Checked);无忧脚本M)_C\d'D[K$S/E2v
                CheckAllParentNodes(e.Node, e.Node.Checked);

            }无忧脚本s B"Eg2d V(L
        }

无忧脚本3R}n&?f GU~,\
        public void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
A!k^)el+f1P Z-X E0        {
v;Y.@ FKd0            foreach (TreeNode node in treeNode.Nodes)无忧脚本(Q(m0ACwO+ry
            {
_Y"z6eQ)}&c0                node.Checked = nodeChecked;无忧脚本Z*[G o ~u5^zP
                if (node.Nodes.Count > 0)无忧脚本!C*FnL A%w5}
                {
~0vtHV!NWN `X0                    this.CheckAllChildNodes(node, nodeChecked);无忧脚本7cB$l,P l*j)k m'N
                }
7_8uDr9f0            }无忧脚本[`@(`:b:Iy
        }

        public void CheckAllParentNodes(TreeNode td, bool check)无忧脚本&Hel,@] S7ba
        {无忧脚本3WXk2D$mA&W
            if (td.Parent != null)
"V.Q Cpq0            {
7b6|;Y%aY F$z&y8Ma0               无忧脚本xg.}+g8YPXz3J
                    td.Parent.Checked = HasChildChecked(td.Parent);
` yWP1b/@l2Ip0                无忧脚本} h+@t? ^jZ
                CheckAllParentNodes(td.Parent, check);无忧脚本n D.H8H%n
            }无忧脚本y lf({!r8@Z
        }

        public bool HasChildChecked(TreeNode td)
%XHdW7?.V0        {
9{9{wDf'^/K)w0            foreach (TreeNode treenode in td.Nodes)
x*Wk!vu1[7I&p0            {无忧脚本Sg-r5eP
                if (treenode.Checked)无忧脚本jk1D9h{8S
                {无忧脚本"tW*z&X:f
                    return true;
5W+g9g7T"JX0                }
'O:c`%c,l0PA)D^'o0                HasChildChecked(treenode);无忧脚本+{,O.k cz8B
            }

            return false;无忧脚本B)q s/lQH*is!_v
        }

    }
\2Bt%j zC4qsJ3N;y0}


aaaaaa

aaaaaa

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)