tree 打钩的问题 就是实现父节点打钩,子节点全部打钩;子节点全钩则父节点自动钩的功能 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 选中后,子节点的变化private void treeView1_AfterCheck(object sender, TreeViewEventArgs e){ CheckChildNode(e.Node);}public void CheckChildNode(TreeNode node){ if (node.GetNodeCount(false) > 0) { foreach (TreeNode childnode in node.Nodes) { childnode.Checked = node.Checked; if (childnode.GetNodeCount(false) > 0) { CheckChildNode(childnode); } } }}全部选中后,上级节点的代码与此相似 private void treeView1_AfterCheck(object sender, TreeViewEventArgs e){ CheckParentNode(e.Node);}public void CheckParentNode(TreeNode node){ if (node.Parent != null) { foreach (TreeNode childnode in node.Parent.Nodes) { if (childnode.Checked != node.Checked) return; } node.Parent.Checked = node.Checked; CheckParentNode(node.Parent); }}上面两种是全部的 7楼与8楼的代码,单独运行没问题正确,合起来死循环。 改进了一下:private void treeView1_AfterCheck(object sender, TreeViewEventArgs e){ CheckChildNode(e.Node); CheckParentNode(e.Node);}public void CheckChildNode(TreeNode node){ if (node.GetNodeCount(false) > 0) { foreach (TreeNode childnode in node.Nodes) { if (childnode.Checked != node.Checked) childnode.Checked = node.Checked; if (childnode.GetNodeCount(false) > 0) { CheckChildNode(childnode); } } }}public void CheckParentNode(TreeNode node){ if (node.Parent != null) { foreach (TreeNode childnode in node.Parent.Nodes) { if (childnode.Checked != node.Checked) return; } if (node.Parent.Checked != node.Checked) node.Parent.Checked = node.Checked; CheckParentNode(node.Parent); }} //下班了 这个只适合2级节点 要适合更多的需要用递归//难得写了//楼上的2个方法放一起 ,会产生死循环的 private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { TreeNode parentnode = e.Node.Parent; TreeNodeCollection childnode = e.Node.Nodes; bool check = e.Node.Checked; foreach (TreeNode tn in childnode) { tn.Checked = check; } if (parentnode != null) { int i = 0; int j = 0; foreach (TreeNode tn in parentnode.Nodes) { if (tn.Checked) { i++; } else { j++; } } if (i == parentnode.Nodes.Count || j == parentnode.Nodes.Count) { parentnode.Checked = check; } } } 我也写一段 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { this.treeView1.AfterSelect -= new TreeViewEventHandler(treeView1_AfterSelect); //先处理父节点,只处理上一层 if (e.Node.Parent != null) { foreach (TreeNode childnode in e.Node.Parent.Nodes) { if (childnode.Checked != e.Node.Checked) return; } if (e.Node.Parent.Checked != e.Node.Checked) e.Node.Parent.Checked = e.Node.Checked; } //处理子节点,只处理一层 if (e.Node.Nodes.Count> 0) { foreach (TreeNode childnode in e.Node.Nodes) { childnode.Checked = e.Node.Checked; } } this.treeView1.AfterSelect+=new TreeViewEventHandler(treeView1_AfterSelect); } 另一个,前一个有问题 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { this.treeView1.AfterSelect -= new TreeViewEventHandler(treeView1_AfterSelect); //先处理父节点,只处理上一层 if (e.Node.Parent != null&&e.Node.Checked!=e.Node.Parent.Checked) { bool childcheck = true; foreach (TreeNode childnode in e.Node.Parent.Nodes) { if (childnode.Checked != e.Node.Checked) childcheck=false; } if (childcheck) e.Node.Parent.Checked = e.Node.Checked; } //处理子节点,只处理一层 if (e.Node.Nodes.Count> 0) { foreach (TreeNode childnode in e.Node.Nodes) { childnode.Checked = e.Node.Checked; } } this.treeView1.AfterSelect+=new TreeViewEventHandler(treeView1_AfterSelect); } 楼上用错事件了, treeView1_AfterSelect 是选中内容 ,不应该对Checked有影响 因为需要递归,两个方法独立是必要的。影响最少的事件,又优化了一下:private void treeView1_AfterCheck(object sender, TreeViewEventArgs e){ this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck); CheckChildNode(e.Node); CheckParentNode(e.Node); this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);}public void CheckChildNode(TreeNode node){ if (node.GetNodeCount(false) > 0) { foreach (TreeNode childnode in node.Nodes) { if (childnode.Checked != node.Checked) childnode.Checked = node.Checked; if (childnode.GetNodeCount(false) > 0) { CheckChildNode(childnode); } } }}public void CheckParentNode(TreeNode node){ if (node.Parent != null) { foreach (TreeNode childnode in node.Parent.Nodes) { if (childnode.Checked != node.Checked) return; } if (node.Parent.Checked != node.Checked) node.Parent.Checked = node.Checked; CheckParentNode(node.Parent); }} 跪求解决 access中数据库的插入操作 求助求助,在线等大家帮忙 求住自定义事件问题 反射工厂怎么弄?详细点~代码贴出来。~谢谢~ c# windows应用程序中怎么实现气泡信息提示,谢谢! 奇怪的事.大家一定感兴趣. 谁能发个代码加亮并格式化显示的代码 SkinEngine 谁会用virtualPC建虚拟网? 问一个高难度的问题,高手菜鸟都请进,up有分! 用c#写手机聊天程序,很多问题不明白。。大家帮帮忙 C# winform Log4Net 使用gmail发送日志的问题
{
CheckChildNode(e.Node);
}public void CheckChildNode(TreeNode node)
{
if (node.GetNodeCount(false) > 0)
{
foreach (TreeNode childnode in node.Nodes)
{
childnode.Checked = node.Checked; if (childnode.GetNodeCount(false) > 0)
{
CheckChildNode(childnode);
}
}
}
}
全部选中后,上级节点的代码与此相似
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
CheckParentNode(e.Node);
}public void CheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
foreach (TreeNode childnode in node.Parent.Nodes)
{
if (childnode.Checked != node.Checked) return;
}
node.Parent.Checked = node.Checked;
CheckParentNode(node.Parent);
}
}
上面两种是全部的
{
CheckChildNode(e.Node);
CheckParentNode(e.Node);
}public void CheckChildNode(TreeNode node)
{
if (node.GetNodeCount(false) > 0)
{
foreach (TreeNode childnode in node.Nodes)
{
if (childnode.Checked != node.Checked)
childnode.Checked = node.Checked;
if (childnode.GetNodeCount(false) > 0)
{
CheckChildNode(childnode);
}
}
}
}
public void CheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
foreach (TreeNode childnode in node.Parent.Nodes)
{
if (childnode.Checked != node.Checked) return;
}
if (node.Parent.Checked != node.Checked)
node.Parent.Checked = node.Checked;
CheckParentNode(node.Parent);
}
}
//下班了 这个只适合2级节点 要适合更多的需要用递归
//难得写了
//楼上的2个方法放一起 ,会产生死循环的
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
TreeNode parentnode = e.Node.Parent;
TreeNodeCollection childnode = e.Node.Nodes;
bool check = e.Node.Checked; foreach (TreeNode tn in childnode)
{
tn.Checked = check;
} if (parentnode != null)
{
int i = 0;
int j = 0;
foreach (TreeNode tn in parentnode.Nodes)
{
if (tn.Checked)
{
i++;
}
else
{
j++;
} }
if (i == parentnode.Nodes.Count || j == parentnode.Nodes.Count)
{
parentnode.Checked = check;
}
}
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
this.treeView1.AfterSelect -= new TreeViewEventHandler(treeView1_AfterSelect);
//先处理父节点,只处理上一层
if (e.Node.Parent != null)
{
foreach (TreeNode childnode in e.Node.Parent.Nodes)
{
if (childnode.Checked != e.Node.Checked) return;
}
if (e.Node.Parent.Checked != e.Node.Checked)
e.Node.Parent.Checked = e.Node.Checked;
} //处理子节点,只处理一层
if (e.Node.Nodes.Count> 0)
{
foreach (TreeNode childnode in e.Node.Nodes)
{
childnode.Checked = e.Node.Checked;
}
}
this.treeView1.AfterSelect+=new TreeViewEventHandler(treeView1_AfterSelect);
}
{
this.treeView1.AfterSelect -= new TreeViewEventHandler(treeView1_AfterSelect);
//先处理父节点,只处理上一层
if (e.Node.Parent != null&&e.Node.Checked!=e.Node.Parent.Checked)
{
bool childcheck = true;
foreach (TreeNode childnode in e.Node.Parent.Nodes)
{
if (childnode.Checked != e.Node.Checked) childcheck=false;
}
if (childcheck) e.Node.Parent.Checked = e.Node.Checked;
} //处理子节点,只处理一层
if (e.Node.Nodes.Count> 0)
{
foreach (TreeNode childnode in e.Node.Nodes)
{
childnode.Checked = e.Node.Checked;
}
}
this.treeView1.AfterSelect+=new TreeViewEventHandler(treeView1_AfterSelect);
}
{
this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck);
CheckChildNode(e.Node);
CheckParentNode(e.Node);
this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
}public void CheckChildNode(TreeNode node)
{
if (node.GetNodeCount(false) > 0)
{
foreach (TreeNode childnode in node.Nodes)
{
if (childnode.Checked != node.Checked)
childnode.Checked = node.Checked;
if (childnode.GetNodeCount(false) > 0)
{
CheckChildNode(childnode);
}
}
}
}
public void CheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
foreach (TreeNode childnode in node.Parent.Nodes)
{
if (childnode.Checked != node.Checked) return;
}
if (node.Parent.Checked != node.Checked)
node.Parent.Checked = node.Checked;
CheckParentNode(node.Parent);
}
}