TTreeNode没有Visible属性,因此不存在明显的选项。有没有其他方法可以使TTreeNode及其所有子节点不可见?当然,我希望以后能够再次显示它。
这是Delphi 2007。
注意#1:我知道替代TVirtualTreeView,如果没有简单的方法可以通过TTreeView完成此操作,我会查看它。
注意#2:我只需要顶级节点的选项。我想隐藏的人通常都没有孩子。
答案 0 :(得分:7)
将数据与用户界面分开是一个好主意,而树视图的这个问题就是一个很好的例子 - 不在树视图中存储数据。我经常有一个非可视单元,它包含一个存储数据的结构化类。用户界面单元可以具有树视图,该树视图可以显示来自该类的数据(可配置的子集)。有两种方法可以在两者之间移动数据。这种隔离需要一些规划,但提供了更大的灵活性和稳定性。
答案 1 :(得分:5)
如果您想使用更好的树组件,为什么不使用Virtualtreeview。它是为Delphi开发的最好的组件之一,它可以免费与源码一起使用!但隐藏ttreenode可能存在逻辑问题!当没有节点可见时,树是否应显示+号?
答案 2 :(得分:4)
TTreeView是标准Windows树视图的包装器,它(从documentation on MSDN判断)不允许隐藏树节点。它也有意义,因为已知树视图不能扩展到大量节点,因此隐藏树节点而不是删除不必要的所有内容将是一个坏主意。
如果您只删除并插入顶级节点(您要隐藏的节点),并在 OnExpanding 事件中创建所有子节点,则可以使您的生活更轻松一些。添加节点。为此,您只需将节点的 HasChildren 属性设置为true。
答案 3 :(得分:3)
在TTreeView中“隐藏”节点的唯一方法是实际删除它。然后,要“显示”节点,只需重新插入即可。
答案 4 :(得分:2)
我是如何使用标准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);
完成。我希望它会对你有所帮助。
答案 5 :(得分:1)
我通过将节点移动到另一个非扩展节点来解决此问题,反之亦然。 我在扩展事件处理程序中完成了它。