关于作者

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

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

长话短说,上代码:

绑定treeview无忧脚本:C$go R7o5o5c3AE/?J;xh
private void GetMenuStripItemName(ToolStripItemCollection items, TreeNodeCollection treeNodeCollection)无忧脚本7ak5SJ,w4O Z bi
        {
CL`7b {.DF U0            foreach (ToolStripItem item in items)无忧脚本QBOlwnJea
            {
j@utGa6b0                if (item is System.Windows.Forms.ToolStripMenuItem)无忧脚本:v^ c `x;R6t F+M4V(B S
                {无忧脚本NZ5A(u[0`'S6w
                TreeNode tempTreeNode = new TreeNode(item.Text);
1R+D,T9[)Q0                tempTreeNode.Checked = IsHaveRight(item.Text);无忧脚本(}"J ~ g(Z
                treeNodeCollection.Add(tempTreeNode);

              
s[a HW(X N0                    this.GetMenuStripItemName(((ToolStripMenuItem)item).DropDownItems, tempTreeNode.Nodes);无忧脚本qr^D2[x%X
                }
n2f"]%gL;UA2a?W0            }
;@X{W*d[v R [D{0        }无忧脚本2{x*F K*`"pA D
        //得到用户权限
`X?p$y]N&Sc0        private bool IsHaveRight(string MenuText)
H^b;sjv$Gx,z ZI0        {无忧脚本7t L/MOT*kDCZ L
            //foreach (User.UserRightRow row in user.UserRight)
``Tx2u bCzo-u9_0            //{
+smX.] jvz9b0            //    if (row.UserRightMenu == MenuText)无忧脚本~(s0R6Y-m'k:W
            //    {无忧脚本1}p!i!t{N
            //        if (row.UserHaveRight == true)
g8HJm3I$hsRJA0            //        {
J%J.FZcjF0            //            return true;
p1S;E@E1vA^!Yef5H0            //        }
9j(HD$Y} l;e~/~/t0            //        else
d/f@Ai B jO-F&[0            //        {无忧脚本W;H*o? Z8?,eh
            //            return false;
f c:~7z+{W*}0            //        }
%[7Q+Y`%]o0            //    }无忧脚本qcr^,n$S
            //}
7L7FI9H%`@4a0            return false;无忧脚本F-j)ddy!AsQ
        }

得到主form的菜单,注意,要设置主form的MainMenuStrip无忧脚本 Q+it]}0V%}$_k
 private void PopedomForm_Load(object sender, EventArgs e)无忧脚本7eo7KK3R1z*@
        {
.j VEvMb:Z0            MenuStrip menu = this.ParentForm.MainMenuStrip;
J|OF {Z4L$w0            GetMenuStripItemName(menu.Items, treeView1.Nodes);
tx0f1a#K0        }

在选中事件中

无忧脚本nMc/j$|
        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)无忧脚本Z'C5eJQ`6a
        {
@R+m$K,w9Y6~5Woj0            if (e.Action != TreeViewAction.Unknown)
]9f1NHN P']t:p(k0            {无忧脚本.P MB^/{y
                CheckAllChildNodes(e.Node, e.Node.Checked);

                //选中父节点   无忧脚本)W,J |Z:Do3bb
                bool bol = true;无忧脚本 M_@E2F G~
                if (e.Node.Parent != null)无忧脚本)[3Z#Z7oin
                {
1KP4[1x#j ]-kf M0                    //for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)无忧脚本d;| I e s;qgU
                    //{
6^H8q"U2[7gl0                    //    if (!e.Node.Parent.Nodes[i].Checked)无忧脚本%jh;y6n%X-Up
                    //        bol = false;
L!`|$x7y'L@E@W0                    //}

无忧脚本 _7\&]H#o(ds&L
                    ///修改当某一子节点选中时,所有父节点选中。当子节点全取消选中时,所有父节点选中无忧脚本 eK V)o_%@ i\Go&D8J
                    bol = e.Node.Checked;无忧脚本2|Z/h8`l
                    if (bol == true)
A'C ~F$jh!p H0in0                    { }无忧脚本;p!IY M t8`HW
                    else
y:lLv8Y8z5EN0IS0                    {
t!vy2A }-f/ga"R9s0                        for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)
8m)e KJ?4K*y1X)l#U0                        {
sZ-xr;v[n eh:e0                            if (e.Node.Parent.Nodes[i].Checked)无忧脚本@/P v nl.}u|
                            {无忧脚本 |7]t GS
                                bol = true;
P\)rY(]0{0                                break;
d"Tk/C!y}(F8M0                            }无忧脚本#Wo'}HI };j.LO
                        }无忧脚本ob2rK%v%H
                    }

无忧脚本P0n5W+^Xo$Q/]X.e
                    TreeNode tn = e.Node;无忧脚本'eu m%n%]7o
                    while (tn.Parent != null)
%a3T*J9aE0                    {
9Cw UR9ss{K0                        tn = tn.Parent;无忧脚本$jV @s}W+r!e
                        tn.Checked = bol;无忧脚本H-^ K C6fU8F6d
                    }
7IW_s*z#^Gw(I0                    tn.Checked = bol;
5{(|!dO)aM!v[ r0                }
pm!L%j8~+?0            }   无忧脚本KF-o2^1Gf$G,C1G
        }无忧脚本9RZ|["|
//选中子节点  
.~5V3u9}`Gh d#H/E Ca0        public void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
*pV'l@&J [r0        {无忧脚本^;WZLjnw
            foreach (TreeNode node in treeNode.Nodes)无忧脚本't,k#` P N$t)O O$f~
            {无忧脚本aqXD(] g.uJ g
                node.Checked = nodeChecked;
1r9xI+O'D0                if (node.Nodes.Count > 0)
d spW#m w^Pw0                {
9jz)lWK yu6t,u%}0                    this.CheckAllChildNodes(node, nodeChecked);
3wR.Fx~m }_h&E0                }
Z6gO{[3Y \}0            }
\~sV${"@:Pli0        }

 

//法二

using System;无忧脚本H9w9KKm"L
using System.Collections.Generic;
Pe O*Nsm0using System.ComponentModel;
|&P4y4{Rl Q'gkp1_0using System.Data;无忧脚本+?6]}`%^*y
using System.Drawing;无忧脚本"W7J5Avt)qN0~
using System.Text;无忧脚本)B1{.]b/C
using System.Windows.Forms;

namespace WinFormTest
/ZT/t-Gr9HJ R0{无忧脚本,mp#u"H D!`e
    public partial class Manage : Form
(^^UNp)Z3l;Ly0    {
-C"_4`7Z9i3I0        public Manage()无忧脚本9Yr$~5n+lg NR
        {
t;Gz _d0            InitializeComponent();
!EZ4i2e1RoK0        }

        private void Manage_Load(object sender, EventArgs e)无忧脚本;ybo1c.uOW|`8K
        {无忧脚本Lpsnp[Zn i"|$]
            DataSet ds = new DataSet();

            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["connString1"].ToString());无忧脚本4R3GUHFSD/pV
            System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("Select * from TreeTemp", conn);无忧脚本 b@4jqr7m9u
            da.Fill(ds);无忧脚本Kin Bm!};|
            buildTree(this.treeView1, ds);
S E}Sx0        }

        private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
j-i5H(U3I3p+W,p0        {
'Z0E2?0W(q@f0            if (e.Node.Nodes.Count == 0)无忧脚本6v1ep0tA&H~2l;mF7L
            {无忧脚本oLR~:A&^$D fNJsK
                MessageBox.Show(e.Node.Name);
"b+p@9A(u a0            }
)gP&nP/t0        }

无忧脚本 R}1m$u6?4g
        public bool buildTree(TreeView TreeViewName, DataSet ds)
Q:t(B\%K c[`0        {
q su8k)~4yxZ0            treeView1.Nodes.Clear();
T_a$c`%?J0           
2mv te-B WK/Lbc6Y0            //如果为最高级,则修改以适应ds的relation中的关系
q i7}Y^U+QZ7KJ/c0            foreach (DataRow dbRow in ds.Tables[0].Rows)
:N5B {|'w0O?n%Z8U0            {无忧脚本 K;ST.jo&k;`
                if (dbRow["ParentMenu"].ToString() == "0")
/a,I(^u'B7o8Hg6M0                {无忧脚本M6o'{7Xw taCE
                    dbRow["ParentMenu"] = DBNull.Value;无忧脚本3KC?]\3BhP
                }
r3xk![{0            }无忧脚本 [B3}e\
            ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["ChildMenuID"], ds.Tables[0].Columns["ParentMenu"]);

            //循环绑定父node无忧脚本m }z3j+K~t@
            foreach (DataRow dbRow in ds.Tables[0].Rows)无忧脚本6Y-}u'{ @Us]*w!f3_K
            {
ZYX!`A&`i0                if (dbRow.IsNull("ParentMenu"))
*B vno5A)Q?3i1Aw%xX0                {
-]5Uu9w7CSRtN0                    TreeNode newNode = CreateNode(dbRow["ChildMenu"].ToString(), dbRow["NavigateUrl"].ToString());
1iK2O"O+AF0                    无忧脚本.H)P K8y&n&^Jc"I
                    TreeViewName.Nodes.Add(newNode);无忧脚本J.O ~)Bc2FP%I
                    PopulateSubTree(dbRow, newNode);//绑定此父节点的所有子节点无忧脚本VM,X'kj%l*n
                }
:EoxT_OOH0            }无忧脚本*q{)t3A$}[.{#w&T6\V
            return true;无忧脚本,sv D*@|S1~
        }无忧脚本x Y"Hw$?8M!J)y
        private void PopulateSubTree(DataRow dbRow, TreeNode node)无忧脚本kxj9v_ vUd8fIw
        {
u1C8Q$AQ-O^v3~0            foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
`+A#v0Vi R$ac7K0            {无忧脚本:i#f7px)S'F D
                TreeNode childNode = CreateNode(childRow["ChildMenu"].ToString(), childRow["NavigateUrl"].ToString());
kH-@3b:Q,y?{0                node.Nodes.Add(childNode);无忧脚本i/?3u,@Ld
                无忧脚本?,z2_9AeJi0t G5\
                PopulateSubTree(childRow, childNode);
V"kz4\|0R/|0            }
#BYAoq0        }

        private TreeNode CreateNode(string text, string NavigateUrl)
!b'U.k6N%S@(`0        {
@.N){LMXi2h8?0            TreeNode node = new TreeNode();
R EzeT){9Ak0            /*
xh"|0`HR@0O0             * 其他node属性自己添加,现在只添加两个
rd.?&wP;I[,_0            node.ID;
;d;qS,n7h }*[9bj uvy0            node.ImageUrl;无忧脚本~7F1Ww$Bk!x&L]
            node.Target;无忧脚本&W{+[DXQ0T
            node.Expanded;
})b8q-nS!_0CYK1D0            node.CheckBox
,cTZ b3fQ0             * */无忧脚本[_S/n)bS
            node.Text = text;
0N/v1v(A8_M$?.Z0            node.Name = NavigateUrl;无忧脚本;y$ZX:kk}
            return node;
&M;[5\Q:k#Z0        }

        private void button1_Click(object sender, EventArgs e)无忧脚本:t'd2v&G2noa&l |6C*|&~
        {无忧脚本3j:^"?lb'YK*@
            MessageBox.Show(this.treeView1.Nodes.Count.ToString());无忧脚本+z*JbB0R-@HA
            //Form1 f1 = new Form1();
%G Shk|d1B8d @+]*K0            //f1.ShowDialog();
dU)`y&C HH*`7a0        }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
e.Gg9N9]L{c0        {
JmoY A~Ik*W0            if (e.Action != TreeViewAction.Unknown)无忧脚本-n#|0Yu G
            {
m4u#B$aw3}qk{1W/Uc0                CheckAllChildNodes(e.Node, e.Node.Checked);无忧脚本t8e@1{"_+Qe!T
                CheckAllParentNodes(e.Node, e.Node.Checked);

            }无忧脚本5gB ]Fu8L1])ujl6}$t
        }

无忧脚本 B FX2Oe/}(f
        public void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
i%^'Y DO,R'zR?0        {
k9L&@;n+^7O y0            foreach (TreeNode node in treeNode.Nodes)无忧脚本e;W nR2O!Rl:m,f
            {无忧脚本9JYXK^|Qp5P
                node.Checked = nodeChecked;无忧脚本 @$Tgxn
                if (node.Nodes.Count > 0)无忧脚本e C,l:Af2Zj
                {无忧脚本_YIrH
                    this.CheckAllChildNodes(node, nodeChecked);
#f`+j\/o4A4r0                }无忧脚本Ab-~}C3T&i,Q}'_
            }
]'I-xrGjG-W@:Sk-W0        }

        public void CheckAllParentNodes(TreeNode td, bool check)无忧脚本 uScK6Zum,t \ ^
        {无忧脚本t9r&Tx XR)V6i
            if (td.Parent != null)
0`[2q`{r-q&\T1G*B0            {无忧脚本M7p/R'_ f6`5d
               无忧脚本/r,y5K0e0gi
                    td.Parent.Checked = HasChildChecked(td.Parent);
;Uh+gwP h*e0                无忧脚本Cw!_(d\k*m U'\ ytg
                CheckAllParentNodes(td.Parent, check);无忧脚本:]aC})Rjb
            }无忧脚本*? V+Zjr#ji$v!Z'z
        }

        public bool HasChildChecked(TreeNode td)
/R3~"^ {^0        {
#A-^2YFt_y!WS0            foreach (TreeNode treenode in td.Nodes)
;fr0W:sg/ai'x0            {
F)|3u.{ ? w/Vl0                if (treenode.Checked)
Q&r~.oa0|r0                {
W1G9H-o]M|0                    return true;
KW|Q3u0                }无忧脚本E}1]'h lG,c
                HasChildChecked(treenode);
R4W-nTb5oZ F ~0            }

            return false;无忧脚本.?0K0GC3_T
        }

    }
D.YY-au0}


aaaaaa

aaaaaa

TAG:

 

评分:0

我来说两句

显示全部

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