Delphi TreeView 选择父节点,选择所有子节点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi TreeView 选择父节点,选择所有子节点相关的知识,希望对你有一定的参考价值。
在delphi中,通过数据库形成了一个动态的treeview对结构,当选择父节点时,子节点全部选中,当不选择父节点时,子节点全部不被选中,且不可以选择!
参考技术A 1、点击节点,首先判断是否可以选择。通过TreeNode.Parent是否nil,判断是否有父节点,如果有,则父节点是否可选择,如果不可选择,则当前节点,不可选择。
2、在点击节点时,遍历所有子节点。这里采用递归调用。
首先用HasChildren,判断选中节点是否有子节点。
没有,则返回。
有,则GetFirstChild,然后循环使用GetNextChild,所作操作(1)设置所有子节点的Selected属性和父节点相同(2)递归调用当前子节点。本回答被提问者采纳
C# TreeView 折叠/展开父选择
【中文标题】C# TreeView 折叠/展开父选择【英文标题】:C# TreeView Collapse/Expand on parent select 【发布时间】:2012-04-24 23:51:00 【问题描述】:这个很难解释,所以我只会告诉你我想要实现什么以及我是如何做到的,所以也许有人会知道我做错了什么。
在我的 winForm 中,我有一个填充的 TreeView 控件。所有父母都有孩子(任意数量),但没有孩子有自己的孩子。示例:
- Parent 1
Child 1
Child 2
Child 3
- Parent 2
Child 4
我想要的行为如下:
-
当用户点击一个孩子时,它会被选中(默认完成)
当用户单击父级时,它应该折叠或展开,但不更改任何选择
第 1 点没有问题,因为它是 TreeView 的默认行为,但第 2 点是另一回事。
这是我到目前为止所做的:
为了防止父对象被选中,我添加了一个 BeforeSelect 事件处理程序并在其中放入以下代码:
if (e.Node.Parent == null)
e.Cancel = true;
这完美地完成了这项工作。所以现在我取消了对父级的选择,我想展开或折叠它。所以我把上面的代码改成:
if (e.Node.Parent == null)
if (e.Node.IsExpanded)
e.Node.Collapse();
else
e.Node.Expand();
e.Cancel = true;
这有点工作 - 除了,与单击 + 号不同,调用 Expand() 或 Collapse() 会选择父节点,而忽略 e.Cancel = true;行。
我尝试在调用 Collapse() 或 Expand() 之前获取 SelectedNode,然后将其重新设置 - 它可以工作,但是当我这样做时,它会再次展开父节点以进行选择。
不知何故,当我单击父级时,+ 号正是我想要发生的事情 - 我似乎无法让它工作。
想法?
提前致谢
【问题讨论】:
【参考方案1】:试试这个:
private bool allowExpandCollapse = false;
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
e.Cancel = !allowExpandCollapse;
private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
e.Cancel = !allowExpandCollapse;
private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
if (e.Node.Parent == null)
e.Cancel = true;
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
if (e.Node.Parent == null)
allowExpandCollapse = true;
if (e.Node.IsExpanded)
TreeNode selectedNode = treeView1.SelectedNode;
e.Node.Collapse();
allowExpandCollapse = false;
treeView1.SelectedNode = selectedNode;
else
e.Node.Expand();
allowExpandCollapse = false;
【讨论】:
复活旧线程的方法 - 哈哈 - 我已经离开了这个项目,但你的答案似乎很可靠,所以我会把它给你 @chiper 你能解释一下这里发生了什么吗?我不完全确定。我的问题是,如果我两次单击同一节点(一次用于展开,一次用于折叠),我的 SelectedNodeChanged 不会触发 我没有在 TreeView 中找到 SelectedNodeChanged 事件。您是说 AfterSelect 吗?实际上,当您单击某个根(可扩展)节点时,此代码不会更改选择。请注意,树的结构应遵循问题中的陈述:“所有父母都有孩子(任意数量),但没有孩子有自己的孩子”以上是关于Delphi TreeView 选择父节点,选择所有子节点的主要内容,如果未能解决你的问题,请参考以下文章