treeview(winform)里实现父选子全选,某一子选所有父选
长话短说,上代码:
绑定treeview无忧脚本:C$goR7o5o5c3AE/?J;xh
private void GetMenuStripItemName(ToolStripItemCollection items, TreeNodeCollection treeNodeCollection)无忧脚本7ak5SJ,w4O
Z
bi
{
CL`7b
{.DFU0 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[vR[D{0 }无忧脚本2{x*F
K*`"pAD
//得到用户权限
`X?p$y]N&Sc0 private bool IsHaveRight(string MenuText)
H^b;sjv$Gx,z
ZI0 {无忧脚本7tL/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.FZcj F0 // return true;
p1S;E@E1vA^!Yef5H0 // }
9j(HD$Y}
l;e~/~/t0 // else
d/f@AiBjO-F&[0 // {无忧脚本W;H*o?Z8?,eh
// return false;
fc:~7z+{W*}0 // }
%[7Q+Y`%]o0 // }无忧脚本qcr^,n$S
//}
7L7FI9H%`@4a0 return false;无忧脚本F-j)dd y!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;|Ies;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!pH0in0 { }无忧脚本;p!IYMt8`HW
else
y:lLv8Y8z5EN0IS0 {
t!vy2A
}-f/ga"R9s0 for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)
8m)eKJ?4K*y1X)l#U0 {
sZ-xr;v[n eh:e0 if (e.Node.Parent.Nodes[i].Checked)无忧脚本@/P v
nl.}u|
{无忧脚本 |7]tGS
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;无忧脚本'eum%n%]7o
while (tn.Parent != null)
%a3T*J9aE0 {
9CwUR9ss{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)OO$f~
{无忧脚本aqXD(] g.uJ
g
node.Checked = nodeChecked;
1r9xI+O'D0 if (node.Nodes.Count > 0)
d
sp W#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;
PeO*Ns m0using 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-Gr9HJR0{无忧脚本,mp#u"HD!` e
public partial class Manage : Form
(^^UN p)Z3l;Ly0 {
-C"_4`7Z9i3I0 public Manage()无忧脚本9Yr$~5n+lg
NR
{
t;Gz_d0 InitializeComponent();
!EZ4i2e1R oK0 }
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;m F7L
{无忧脚本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 {
qsu8k)~4yx Z0 treeView1.Nodes.Clear();
T_a$c`%?J0
2mv
te-BWK/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"))
*Bvno5A)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;无忧脚本,svD*@|S1~
}无忧脚本xY"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());
