treeview上checkbox选择问题 大家好,在treeview节点的checkbox问题,要求节点被选中的话,该节点的父节点和父节点的父节点一直到根节点都被选中,该节点的子节点也全被选中,当该节点下的全部子节点都未选中的话,该节点也被取消选中 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if(e.Node.Checked == true) { treeNode t; foreach(t in e.Node.Nodes) { t.Checked=true; } http://community.csdn.net/Expert/topic/4755/4755347.xml?temp=.3931238 LZ请参考:http://wf5360308.cnblogs.com/articles/388805.html if(e.Node.Checked == true) { treeNode t; foreach(t in e.Node.Nodes) { t.Checked=true; } } if(e.Node.Checked == false) { treeNode t; bool f; f=false; foreach(t in e.Node.Parent.Nodes) { if(t.Checked==true) { f=true; } } if(f==false) { e.Node.Parent.Checked = false; } } 我用VB.NET写的,给你转化了一下到C#不知道好用不,试试。TreeCaiDan是treeview控件private void TreeCaiDan_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e) { TreeNode TreeN; TreeNode TreeP; string[] strNode; if (BoolCheck == false) { if (e.Node.Nodes.Count > 0) { TreeN = FindChildrenChk(e.Node); if (!(TreeN == null)) { foreach (int TreeP in TreeN.Parent.Nodes) { if (e.Node.Checked == true) { TreeP.Checked = true; } else { TreeP.Checked = false; } } } } } if (!(e.Node.Parent == null)) { if (e.Node.Checked == true) { BoolCheck = true; e.Node.Parent.Checked = true; } } BoolCheck = false; } private object FindChildrenChk(TreeNode tvParent) { TreeNode tn = tvParent; TreeNode NodeTemp = new TreeNode(); NodeTemp = FindChildren(tvParent); if (NodeTemp == tn) { return null; } else { return NodeTemp; } } 参看http://blog.csdn.net/knight94/archive/2006/04/10/657658.aspx chengpei_chen() 你的代码不完全,FindChildren()没有定义 duguguiyu1984能不能把代码发来看看,我对递归不太了解 忘了一个函数 ' 返回值第一个Children节点 Private Function FindChildren(ByVal tvParent As TreeNode) Dim TreeNT As New TreeNode If Not tvParent.Nodes.Count > 0 Then Return tvParent TreeNT = tvParent.Nodes.Item(0) Return TreeNT End Function //当树的CheckBox状态改时 private void PopedomManage_AfterCheck(object sender, TreeViewEventArgs e) { //当节点为叶子时,checkBox的值改变将保存改变的值 if (e.Node.Nodes.Count == 0 ) { this.AfterCheck -=new TreeViewEventHandler(PopedomManage_AfterCheck); TreeNode mytn = e.Node; upChecked(ref mytn); upNoChecked(ref mytn); this.AfterCheck +=new TreeViewEventHandler(PopedomManage_AfterCheck); } //当点击上级节点时,会联动下级节点 System.Collections.IEnumerator myIEnumerator = e.Node.Nodes.GetEnumerator(); while (myIEnumerator.MoveNext()) { ((TreeNode)myIEnumerator.Current).Checked = e.Node.Checked; } } //下级节点有选中,则上级节点为选中 private void upChecked(ref TreeNode mytn) { if (mytn.Parent == null) { return; } if (mytn.Checked == true) { mytn.Parent.Checked = true; //再调用本函数 TreeNode mytnParent = mytn.Parent; upChecked(ref mytnParent); } } //下级全级没有选中,则上节为没有选中状态 private void upNoChecked (ref TreeNode mytnNo) { if (mytnNo.Parent == null) { return; } System.Collections.IEnumerator myIEnumerator = mytnNo.Parent.Nodes.GetEnumerator(); while (myIEnumerator.MoveNext()) { if (((TreeNode)myIEnumerator.Current).Checked == true ) { return; } } mytnNo.Parent.Checked = false; //再次调用本函数 TreeNode mytnNoParent = mytnNo.Parent; upNoChecked (ref mytnNoParent); } 忘了要转为C# 的一开始的变量private bool BoolCheck = false;private object FindChildren(TreeNode tvParent) { TreeNode TreeNT = new TreeNode(); if (!(tvParent.Nodes.Count > 0)) { return tvParent; } TreeNT = tvParent.Nodes.Item(0); return TreeNT; } http://jhtchina.cnblogs.com/articles/367597.html chengpei_chen D:\welderprj\PowerWeldManageForm\WCH\Sysfun\Role.cs(312): “System.Windows.Forms.TreeNodeCollection”并不包含对“Item”的定义 我做的源代码是在VB中的,可能转化为C#时不全面,C#正在学习 szsymz你的代码里this.AfterCheck 没有定义啊是不是就是PopedomManage_AfterCheck啊 已经结贴,谢谢大家更谢谢szsymz 如何将上传的avi、WMV、MP4、asf等格式的视频文件转换为flash Xtreme Sample Database 2008 是什么? 今天给学生简单排课,想到用算法实现一下,很有趣!大家进来讨论! vs2005(c#)中开发B/S应用程序为什么没有timer控件? 如何获得Imagebutton运行时在页面上的位置 绘图效果 多次点击报错为空求原因 DataGrid和DataTable 求救?堆栈问题? 如何在datagrid里多条记录一起删除? vs 2005中,如何触发TreeNodeCheckchanged事件? WinForm 里的 dataGrid 能不能添加按钮列?
{
treeNode t;
foreach(t in e.Node.Nodes)
{
t.Checked=true;
}
{
treeNode t;
foreach(t in e.Node.Nodes)
{
t.Checked=true;
}
} if(e.Node.Checked == false)
{
treeNode t;
bool f;
f=false;
foreach(t in e.Node.Parent.Nodes)
{
if(t.Checked==true)
{
f=true;
}
} if(f==false)
{
e.Node.Parent.Checked = false;
}
}
private void TreeCaiDan_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
TreeNode TreeN;
TreeNode TreeP;
string[] strNode;
if (BoolCheck == false) {
if (e.Node.Nodes.Count > 0) {
TreeN = FindChildrenChk(e.Node);
if (!(TreeN == null)) {
foreach (int TreeP in TreeN.Parent.Nodes) {
if (e.Node.Checked == true) {
TreeP.Checked = true;
} else {
TreeP.Checked = false;
}
}
}
}
}
if (!(e.Node.Parent == null)) {
if (e.Node.Checked == true) {
BoolCheck = true;
e.Node.Parent.Checked = true;
}
}
BoolCheck = false;
} private object FindChildrenChk(TreeNode tvParent)
{
TreeNode tn = tvParent;
TreeNode NodeTemp = new TreeNode();
NodeTemp = FindChildren(tvParent);
if (NodeTemp == tn) {
return null;
} else {
return NodeTemp;
}
}
http://blog.csdn.net/knight94/archive/2006/04/10/657658.aspx
' 返回值第一个Children节点
Private Function FindChildren(ByVal tvParent As TreeNode)
Dim TreeNT As New TreeNode If Not tvParent.Nodes.Count > 0 Then Return tvParent
TreeNT = tvParent.Nodes.Item(0)
Return TreeNT
End Function
//当树的CheckBox状态改时
private void PopedomManage_AfterCheck(object sender, TreeViewEventArgs e)
{
//当节点为叶子时,checkBox的值改变将保存改变的值
if (e.Node.Nodes.Count == 0 )
{
this.AfterCheck -=new TreeViewEventHandler(PopedomManage_AfterCheck);
TreeNode mytn = e.Node;
upChecked(ref mytn);
upNoChecked(ref mytn);
this.AfterCheck +=new TreeViewEventHandler(PopedomManage_AfterCheck);
}
//当点击上级节点时,会联动下级节点
System.Collections.IEnumerator myIEnumerator = e.Node.Nodes.GetEnumerator();
while (myIEnumerator.MoveNext())
{
((TreeNode)myIEnumerator.Current).Checked = e.Node.Checked;
}
}
//下级节点有选中,则上级节点为选中
private void upChecked(ref TreeNode mytn)
{
if (mytn.Parent == null)
{
return;
}
if (mytn.Checked == true)
{
mytn.Parent.Checked = true;
//再调用本函数
TreeNode mytnParent = mytn.Parent;
upChecked(ref mytnParent);
}
} //下级全级没有选中,则上节为没有选中状态
private void upNoChecked (ref TreeNode mytnNo)
{
if (mytnNo.Parent == null)
{
return;
}
System.Collections.IEnumerator myIEnumerator = mytnNo.Parent.Nodes.GetEnumerator();
while (myIEnumerator.MoveNext())
{
if (((TreeNode)myIEnumerator.Current).Checked == true )
{
return;
}
}
mytnNo.Parent.Checked = false;
//再次调用本函数
TreeNode mytnNoParent = mytnNo.Parent;
upNoChecked (ref mytnNoParent);
}
一开始的变量
private bool BoolCheck = false;private object FindChildren(TreeNode tvParent)
{
TreeNode TreeNT = new TreeNode();
if (!(tvParent.Nodes.Count > 0)) {
return tvParent;
}
TreeNT = tvParent.Nodes.Item(0);
return TreeNT;
}
D:\welderprj\PowerWeldManageForm\WCH\Sysfun\Role.cs(312): “System.Windows.Forms.TreeNodeCollection”并不包含对“Item”的定义
是不是就是PopedomManage_AfterCheck啊