问题描述
类型:VB.NETWINFORMTreeView如何实现联动,选择一个子节点,其父节点虚选择如上:这是效果,PS的谁能提供个实例
解决方案
解决方案二:
.net中的TreeView控件,是實現不了這個功能的,因為牠的選擇框,衹有兩個狀態Checked和UnChecked可以從TreeView派生一個新類來實現,請參考這篇文章
解决方案三:
应该可以用StateImageList选中状态StateImageList的图片列表变换来实现以上效果设置StateImageList怎么弄有没有这方面的资料啊
解决方案四:
又自己解决,不过还是谢谢大家了.把代码共享给需要的朋友首先建立一个ImageList在ImageList里分别放置为钩选,钩选,未知钩选三个图片然后StateImageList里选择该ImageList模块:ModuleDiyTreeViewPublicTreeView_Check_ChangedAsBoolean=True#Region"TreeViewCheckBox联动"PrivateEnumNodeStateAllUnSelected=0'全不选AllSelected=1'全选SomeSelected=2'部分选定EndEnumPublicSubcheckChanged(ByValtreeAsTreeView,ByValeAsMouseEventArgs)IfNotTreeView_Check_ChangedThenTreeView_Check_Changed=TrueExitSubEndIfDimnAsTreeNoden=tree.GetNodeAt(e.X,e.Y)IfnIsNothingThenExitSubEndIfIfn.GetNodeCount(False)>0And(n.ParentIsNothing)ThenIfn.StateImageIndex=0Thenn.StateImageIndex=1ElseIfn.StateImageIndex=1Orn.StateImageIndex=2Thenn.StateImageIndex=0EndIfChangeAllChildNodesState(n,CType(n.StateImageIndex,NodeState))ElseIfn.GetNodeCount(False)>0And(Not(n.ParentIsNothing))ThenIfn.StateImageIndex=0Thenn.StateImageIndex=1ElseIfn.StateImageIndex=1Orn.StateImageIndex=2Thenn.StateImageIndex=0EndIfChangeAllChildNodesState(n,CType(n.StateImageIndex,NodeState))ChangeAllParentState(n)ElseIfn.GetNodeCount(False)=0And(Not(n.ParentIsNothing))ThenIfn.StateImageIndex=0Thenn.StateImageIndex=1ElseIfn.StateImageIndex=1Orn.StateImageIndex=2Thenn.StateImageIndex=0EndIfChangeAllParentState(n)ElseIfn.GetNodeCount(False)=0And(n.ParentIsNothing)ThenIfn.StateImageIndex=0Thenn.StateImageIndex=1ElseIfn.StateImageIndex=1Orn.StateImageIndex=2Thenn.StateImageIndex=0EndIfEndIfEndSub'改变n的所有子节点的状态PrivateSubChangeAllChildNodesState(ByValnAsTreeNode,ByValNodeStateDesAsNodeState)DimmyEnumeratorAsIEnumerator=n.Nodes.GetEnumerator()WhilemyEnumerator.MoveNext()CType(myEnumerator.Current,TreeNode).StateImageIndex=NodeStateDesChangeAllChildNodesState(CType(myEnumerator.Current,TreeNode),NodeStateDes)EndWhileEndSub'n为当前节点(而要被改变状态的是n的父节点,也就是n.parent)PrivateSubChangeAllParentState(ByValnAsTreeNode)DimblnAllUnSelected,blnAllSelectedAsBooleanIfn.ParentIsNothingThenExitSubEndIfDimmyEnumeratorAsIEnumerator=n.Parent.Nodes.GetEnumerator()WhilemyEnumerator.MoveNext()IfCType(myEnumerator.Current,TreeNode).StateImageIndex=2Thenn.Parent.StateImageIndex=2CallChangeAllParentState(n.Parent)ReturnElseIfCType(myEnumerator.Current,TreeNode).StateImageIndex=1ThenIfblnAllUnSelectedThenn.Parent.StateImageIndex=2CallChangeAllParentState(n.Parent)ReturnElseblnAllSelected=TrueEndIfElseIfCType(myEnumerator.Current,TreeNode).StateImageIndex=0ThenIfblnAllSelectedThenn.Parent.StateImageIndex=2CallChangeAllParentState(n.Parent)ReturnElseblnAllUnSelected=TrueEndIfEndIfEndWhileIfblnAllSelectedAndNotblnAllUnSelectedThenn.Parent.StateImageIndex=1CallChangeAllParentState(n.Parent)ReturnEndIfIfblnAllUnSelectedAndNotblnAllSelectedThenn.Parent.StateImageIndex=0CallChangeAllParentState(n.Parent)ReturnEndIfEndSub#EndRegionEndModule
使用方法:DimnewNodeAsNewTreeNode(strText)newNode.StateImageIndex=0'加上这句,加载后全部未钩选nodes.Add(newNode).......'递归加载树然后:PrivateSubmainTreeViewMouseUp(ByValsenderAsObject,ByValeAsWindows.Forms.MouseEventArgs)HandlesTreeView1.MouseUpcheckChanged(TreeView1,e)EndSubPrivateSubTreeViewBeforeCollapse(ByValsenderAsObject,ByValeAsWindows.Forms.TreeViewCancelEventArgs)HandlesTreeView1.BeforeCollapse,TreeView1.BeforeExpandTreeView_Check_Changed=FalseEndSub
解决方案五:
我现在发现这里的很多朋友,自己解决的问题,不告诉大家自己是如何解决的,所以希望大家以后如果自己解决的问题能在帖子上说下解决方法.
解决方案六:
自己写代码做事件,没有现成的
解决方案七:
你可以做成组件
解决方案八:
http://download.csdn.net/source/279669
解决方案九:
这个是我写的组件选择框支持1.选定状态2.未选定3.部分选定4.可以自己定义三状态的图片(设置一个StateImage)0:未选;1:钩选;2:部选5.可以设置从默认已经钩选项目SelectNodes(nodes,str)nodes:需要遍历的节点str:Node的Tag,用来比较是否是需要的节点,所以Tag值必须不一样语言:VB.NET2005调用:VS2005工具箱加入即可