功能:当点击父节点的checkbox则子节点的checkbox也跟随变化 public partial class TreeViewAndCheckbox : Form { public TreeViewAndCheckbox() { InitializeComponent(); //treeview显示checkbox treeView1.CheckBoxes = true; this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck); TreeNode parentNode = new TreeNode("测试父节点"); treeView1.Nodes.Add(parentNode); TreeNode tmpNode01 = new TreeNode("子节点1"); parentNode.Nodes.Add(tmpNode01); TreeNode tmpNode02 = new TreeNode("子节点2"); parentNode.Nodes.Add(tmpNode02); TreeNode tmpNode03 = new TreeNode("子节点3"); parentNode.Nodes.Add(tmpNode03); TreeNode tmpNode04 = new TreeNode("子节点4"); parentNode.Nodes.Add(tmpNode04); } private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action == TreeViewAction.ByMouse) { if (e.Node.Checked) { //取消节点选中状态之后,取消所有父节点的选中状态 setChildNodeCheckedState(e.Node, true); } else { //取消节点选中状态之后,取消所有父节点的选中状态 setChildNodeCheckedState(e.Node, false); //如果节点存在父节点,取消父节点的选中状态 if (e.Node.Parent != null) { setParentNodeCheckedState(e.Node, false); } } } } //取消节点选中状态之后,取消所有父节点的选中状态 private void setParentNodeCheckedState(TreeNode currNode, bool state) { TreeNode parentNode = currNode.Parent; parentNode.Checked = state; if (currNode.Parent.Parent != null) { setParentNodeCheckedState(currNode.Parent, state); } } //选中节点之后,选中节点的所有子节点 private void setChildNodeCheckedState(TreeNode currNode, bool state) { TreeNodeCollection nodes = currNode.Nodes; if (nodes.Count > 0) foreach (TreeNode tn in nodes) { tn.Checked = state; setChildNodeCheckedState(tn, state); } } } 网上找答案,说是windows6.x下面的bug,但是没有找到解决方案,求解? |
|
20分
#1 |
先说下你的VS环境,NET版本
|
20分
#2 |
写在nodeclick里呢
|
20分
#3 |
点击过快,子节点 选中就跟不上?
-》 void tvLeft_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { CheckAllChildNodes(e.Node, e.Node.Checked); //选中父节点 bool bol = true; if (e.Node.Parent != null) { for (int i = 0; i < e.Node.Parent.Nodes.Count; i++) { if (!e.Node.Parent.Nodes[i].Checked) bol = false; } e.Node.Parent.Checked = bol; } } } #region 选中子节点 public void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) { foreach (TreeNode node in treeNode.Nodes) { node.Checked = nodeChecked; if (node.Nodes.Count > 0) { this.CheckAllChildNodes(node, nodeChecked); } } } #endregion |
20分
#5 |
没有体会的人是不能理解的。
|
20分
#6 |
解决方法:1.弱化此功能的作用。
|
#7 |
回复3楼: 不是方法的问题,好像环境的问题?我百度查找,说是windows6.x下面的bug。我用的是VS2012,.NET framework4.5 |
#8 |
已解决:解决方案如下 :
public class MyTreeView : TreeView { protected override void WndProc(ref Message m) { // Suppress WM_LBUTTONDBLCLK if (m.Msg == 0x203) { m.Result = IntPtr.Zero; } else base.WndProc(ref m); } } |