C# 中带有复选框的 TreeView
我在 c# 中有一个带有复选框的树视图,我希望当用户检查一个节点时,自动检查以下级别上的所有节点。 有谁知道如何做到这一点,而无需在每次用户检查某个节点时在所有树上运行递归功能?
谢谢
//这个函数返回treeView。
public TreeView GetTreeView()
{
getSubject();
// fill the treeview with all subjects.
foreach (Subject subject in subjects)
{
//for each root subject fill all the his children.
if (subject.subjestId == subject.parentSubject)
{
TreeNode node = new TreeNode(subject.subjectString, subject.subjestId, subject.subjestId);
addChild(node, subject.subjestId);
tv.Nodes.Add(node);
}
}
return tv;
}
// for each subject return sub subjects.
private void addChild(TreeNode node, int parentId)
{
foreach (Subject subject in subjects)
{
if (subject.parentSubject == parentId && subject.parentSubject != subject.subjestId)
{
TreeNode childNode = new TreeNode(subject.subjectString, subject.subjestId, subject.subjestId);
addChild(childNode, subject.subjestId);
node.Nodes.Add(childNode);
}
}
}
I have a tree view with checkboxes in c#, I want that when the user checks one node all the nodes that there are on the levels below automatic checked also.
Does anyone know about way to do that without run with recorsive fnction on all the tree each time that the user checks some node?
Thanks
//this function returns the treeView.
public TreeView GetTreeView()
{
getSubject();
// fill the treeview with all subjects.
foreach (Subject subject in subjects)
{
//for each root subject fill all the his children.
if (subject.subjestId == subject.parentSubject)
{
TreeNode node = new TreeNode(subject.subjectString, subject.subjestId, subject.subjestId);
addChild(node, subject.subjestId);
tv.Nodes.Add(node);
}
}
return tv;
}
// for each subject return sub subjects.
private void addChild(TreeNode node, int parentId)
{
foreach (Subject subject in subjects)
{
if (subject.parentSubject == parentId && subject.parentSubject != subject.subjestId)
{
TreeNode childNode = new TreeNode(subject.subjectString, subject.subjestId, subject.subjestId);
addChild(childNode, subject.subjestId);
node.Nodes.Add(childNode);
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
递归。像这样:
Recursion. Like this:
这是一个更好的解决方案
This is a better solution
正如许多答案所述,创建一个递归“将检查设置为子项”函数,然后在树上将其称为 AfterCheck。
不幸的是,即使您在代码中设置了检查值,框架也会回调 AfterCheck,尽管这在小树中可能不明显,但会为您的应用程序增加大量指数级的额外工作。为了避免这种情况,请过滤 AfterCheck 以仅在用户触发新函数时才触发该函数。
As a number of the answers state, create a recursive 'set checked to children' function, then call it AfterCheck on the tree.
The framework unfortunately gives you a call back to AfterCheck even if you set the check value in code, and although this may not be noticeable in small trees adds a massive amount of exponential extra work for your app to do. To avoid it, filter AfterCheck to only fire your new function if it has been triggered by user.
我对答案做了一些扩展;也通过更新父级。 [catch 中的
DisplayException
方法只是我经常使用的弹出窗口;你可以自己做]I expanded on the answer a little; by updating the parent as well. [The
DisplayException
method inside the catch is just a popup window that I always use; you can do your own]如果你想在 WinForms 中执行此操作,那么我认为你必须通过递归手动执行此操作 - 我不知道有什么更好的方法。
If you want to do it in WinForms then I think you have to do it manually by recursion - I don't know any better way.