TTreeNode 没有 Visible 属性,因此不存在明显的选项。有没有其他方法可以使 TTreeNode 及其所有子节点不可见?当然,我希望以后能够让它再次可见。
这是德尔福2007。
注意#1:我知道替代的 TVirtualTreeView,如果没有简单的方法可以使用 TTreeView 完成此操作,我会检查它。
注意#2:我只需要顶级节点的选项。我想隐藏的那些通常甚至没有孩子。
TTreeNode 没有 Visible 属性,因此不存在明显的选项。有没有其他方法可以使 TTreeNode 及其所有子节点不可见?当然,我希望以后能够让它再次可见。
这是德尔福2007。
注意#1:我知道替代的 TVirtualTreeView,如果没有简单的方法可以使用 TTreeView 完成此操作,我会检查它。
注意#2:我只需要顶级节点的选项。我想隐藏的那些通常甚至没有孩子。
将数据与用户界面分开是个好主意,树视图的这个问题就是一个很好的例子——不要将数据存储在树视图中。我经常有一个包含存储数据的结构化类的非可视单元。用户界面单元可以有一个树视图,可以显示来自该类的数据(可配置的子集)。有多种方法可以在两者之间移动数据。这种类型的隔离需要一些计划,但提供了更大的灵活性和稳定性。
如果你想使用更好的树组件,为什么不使用 Virtualtreeview。它是为 Delphi 开发的最好的组件之一,并且可以免费使用源代码!但是隐藏 ttreenode 可能存在逻辑问题!当没有节点可见时,树是否应该显示 + 号?
TTreeView 是标准 Windows 树视图的包装器,它(从MSDN 上的文档判断)不允许隐藏树节点。这也很有意义,因为已知树视图不会扩展到大量节点,因此隐藏树节点而不是删除所有不必要的东西将是一个坏主意。
如果您只删除和插入顶级节点(您希望隐藏的节点),并在重新添加节点的OnExpanding事件中创建所有子节点,您可以让您的生活更轻松一些。为此,您只需将节点的HasChildren属性设置为 true。
在 TTreeView 中“隐藏”节点的唯一方法是实际删除它。然后,要“显示”该节点,您只需再次重新插入它。
我是如何使用标准 TTreeView 在 DXE5 中实现的。我认为这对某些人会有所帮助。我做了简单的例子:
1.必须隐藏的项目。我将它的 ImageIndex 设置为 2。
var
Node:TTreeNode;
begin
...
Node:=Tree.Items.AddChild(ParentNode,'Text');
Node.ImageIndex:=2;
2. 现在我设置了TTreeView 的onAdvancedCustomDrawItem 事件。
if Node.ImageIndex=2 then
begin
DefaultDraw:=false;
Node.Parent.HasChildren:=false;
end;
3.用TTreeView的onClick事件检查:
var
Tree:TTreeView;
Node:TTreeNode;
begin
Tree:=Sender as TTreeView;
if Tree.Selected.Index>-1 then
if Tree.Selected.HasChildren then
if Tree.Selected.getFirstChild.ImageIndex=2 then
showmessage(Tree.Selected.getFirstChild.Text);
完毕。我希望它会帮助你。
我通过将节点移动到另一个非扩展节点来解决这个问题,反之亦然。我在扩展事件处理程序中完成了它。