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 选择父节点,选择所有子节点的主要内容,如果未能解决你的问题,请参考以下文章

delphi TreeView 鼠标右击选择节点

delphi中的treeview控件如何取到选择节点的索引号?

DELPHI TreeView,动态添加父节点,子节点

vb中的treeview控件如何使用

关于的Delphi 的treeview控件的用法请教大家

TreeView 点击触发父节点子节点的连锁反应选中与取消